• PostgreSQL 建立一张表到底会产生多少文件


    f13db74ef0047941a211dc1e90ed8760.png

    开头还是介绍一下群,如果感兴趣PolarDB ,MongoDB ,MySQL ,PostgreSQL ,Redis, Oceanbase, 等有问题,有需求都可以加群群内有各大数据库行业大咖,CTO,可以解决你的问题。加群请联系 liuaustin3 ,在新加的朋友会分到2群(共1350人左右 1 + 2 + 3 + 4) 3群 430 已关闭自由申请,新人会进4群,另欢迎 OpenGauss 的技术人员加入。

    每日感悟

    理解一件事情,了解,理解,拆解,是三个层次,大部分情况了解即可,如果要达到理解就需要花一定的时间和力气了,如果是拆解就需要将与这件事有关的里里外外,都梳理形成系统知识

    如果你问我PostgreSQL 在普通的情况下,一个表有几个文件,这个问题不好回答,PostgreSQL对于表数据的存储和复杂的原理下,到底一个表需要多少文件,或者说有多少文件的可能性需要一个梳理。

    PostgreSQL 每一个表通常的情况下,表和索引是分开存储的,在建立表和表的主键后会产生表文件和索引文件,而与此产生的是一个每个表和索引记录其空间的fsm文件 (free space map)方便系统对于文件中有多少空余的空间进行搜寻和记录。针对数据表中死元组需要 进行标记这里也有一个文件vm (visibility map),同时PG中的无日志表本身需要有一个初始化的文件,后缀名为init.

    问题1  在建立一个带有主键的数据表后,存储数据的文件一开始会有几个

    我们产生一张表,并灌入5000万行数据

    create table testdata(id serial primary key,name varchar(20),course int,grade numeric(4,2),testtime date,note text,note1 text);

    32a75d5604e09177c49bbae4b6d01339.png

    1. test=# select oid,relname,relfilenode from pg_class where relname = 'testdata';
    2. -[ RECORD 1 ]---------
    3. oid         | 16724
    4. relname     | testdata
    5. relfilenode | 16724
    6. test=# select oid,relname,relfilenode from pg_class where relname = 'testdata_pkey';
    7. -[ RECORD 1 ]--------------
    8. oid         | 16730
    9. relname     | testdata_pkey
    10. relfilenode | 16730
    11. test=# SELECT oid::regclass AS Table,
    12.        reltoastrelid::regclass As TOAST_Table,
    13.        pg_relation_size(reltoastrelid) AS toast_size
    14. FROM pg_class WHERE relkind = 'r' AND reltoastrelid <> 0 and relname = 'testdata';
    15. -[ RECORD 1 ]------------------------
    16. table       | testdata
    17. toast_table | pg_toast.pg_toast_16724
    18. toast_size  | 0

    从上面的的例子可以看出一个简单的表,在有数据的情况下,有三个文件(toast存在的情况下),数据文件,索引文件和toast文件,这里我们的表本身没有二级索引,我们建立二级索引,查看二级索引文件默认存储的位置。

    我们通过下面的例子来看一下,testdata ,由主数据文件 16724, 主键文件 16730, toast 文件 16728 ,以及二级索引文件 16734 组成。然后我们又建立了一个二级索引,结果是我们又多了一个文件16735.

    create index idx_note on testdata (note);
    1. test=# select oid,relname,relfilenode from pg_class where relname = 'testdata';
    2. select oid,relname,relfilenode from pg_class where relname = 'testdata_pkey';
    3. SELECT oid::regclass AS Table,
    4.        reltoastrelid::regclass As TOAST_Table,
    5.        pg_relation_size(reltoastrelid) AS toast_size
    6. FROM pg_class WHERE relkind = 'r' AND reltoastrelid <> 0 and relname = 'testdata';
    7.  select oid,relname,relfilenode from pg_class where relname = 'pg_toast_16724';
    8. select oid,relname,relfilenode from pg_class where relname = 'idx_note1';
    9. -[ RECORD 1 ]---------
    10. oid         | 16724
    11. relname     | testdata
    12. relfilenode | 16724
    13. -[ RECORD 1 ]--------------
    14. oid         | 16730
    15. relname     | testdata_pkey
    16. relfilenode | 16730
    17. -[ RECORD 1 ]------------------------
    18. table       | testdata
    19. toast_table | pg_toast.pg_toast_16724
    20. toast_size  | 0
    21. -[ RECORD 1 ]---------------
    22. oid         | 16728
    23. relname     | pg_toast_16724
    24. relfilenode | 16728
    25. -[ RECORD 1 ]----------
    26. oid         | 16734
    27. relname     | idx_note1
    28. relfilenode | 16734

    e98f67a56fa712a132f6f4b66e5e0377.png

    1. test=# create index idx_note on testdata (note);
    2. CREATE INDEX
    3. test=# select oid,relname,relfilenode from pg_class where relname = 'testdata';
    4. select oid,relname,relfilenode from pg_class where relname = 'testdata_pkey';
    5. SELECT oid::regclass AS Table,
    6.        reltoastrelid::regclass As TOAST_Table,
    7.        pg_relation_size(reltoastrelid) AS toast_size
    8. FROM pg_class WHERE relkind = 'r' AND reltoastrelid <> 0 and relname = 'testdata';
    9.  select oid,relname,relfilenode from pg_class where relname = 'pg_toast_16724';
    10. select oid,relname,relfilenode from pg_class where relname = 'idx_note';
    11. -[ RECORD 1 ]---------
    12. oid         | 16724
    13. relname     | testdata
    14. relfilenode | 16724
    15. -[ RECORD 1 ]--------------
    16. oid         | 16730
    17. relname     | testdata_pkey
    18. relfilenode | 16730
    19. -[ RECORD 1 ]------------------------
    20. table       | testdata
    21. toast_table | pg_toast.pg_toast_16724
    22. toast_size  | 0
    23. -[ RECORD 1 ]---------------
    24. oid         | 16728
    25. relname     | pg_toast_16724
    26. relfilenode | 16728
    27. -[ RECORD 1 ]---------
    28. oid         | 16735
    29. relname     | idx_note
    30. relfilenode | 16735

    4231f3704c3ea8098e9256b25c7675b8.png

    同时需要注意这里默认的数据文件大小为1G ,建议在安装时将数据文件的大小进行扩展,尽力减少大表文件最大SIZE的限制。

    最后将无日志表的部分也做了,这里情况类似就不进行展示了,最后总结了一下普通的情形下,不同单表有的会产生的数据文件。

    5172aab20aa267ec0541883e21114a9d.png

    0b795f8f2f15ed20facca11e53d03709.png

  • 相关阅读:
    产品设计与用户体验 优漫动游
    STC15单片机-RS-485通信
    torch.save
    Tomcat context.xml配置详解
    Java8中默认实现如何解决冲突?
    使用vagrant在virtualBox中安装linux虚拟机
    初识Nodejs -- nodejs简介
    图形渲染基础学习
    磁盘管理 及 nfs服务配置
    6、规划绩效域
  • 原文地址:https://blog.csdn.net/liuhuayang/article/details/133366858