暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

PostgreSQL技术大讲堂 - 第15讲:数据文件和块存储结构

北京CUUG 2023-04-26
181











Part 15:数据文件和块存储结构


内容1
表的OID与数据文件对应关系
内容2PostgreSQL数据文件存储方式
内容3数据文件、空闲空间地图和可见性地图
内容4
块空间使用方法


对象OID与数据文件对应关系

· PG数据库的一张表或者索引对应一个数据文件。与Oracle集中式的存储方式不同,各有优缺点

· 作为数据库对象的表和索引在内部由各个oid管理,而这些数据文件则由变量relfilenode管理。

· 表和索引的relfilenode值开始时基本上(但并不总是)与相应的oid匹配

    sampledb=# SELECT relname, oid, relfilenode FROM pg_class WHERE relname = 'sampletbl';
    relname | oid | relfilenode
    -----------+-------+-------------
    sampletbl | 18740 | 18740
    (1 row)
    · 相关表的数据文件路径:
      $ cd $PGDATA 
      $ ls -la
      base/16384/18740 -rw------- 1 postgres postgres 8192 Apr 21 10:21 base/16384/18740

      · TRUNCATE、REINDEX、CLUSTER等操作会造成relfilenode号的改变,因为先删除原来的数据文件,再创建一个新的会更快。

        sampledb=# SELECT relname, oid, relfilenode  FROM pg_class 
        WHERE relname = 'sampletbl';
        relname | oid | relfilenode
        -----------+-------+-------------
        sampletbl | 18740 | 18812
        (1 row)

        · 使用内置函数pg_relation_file path查看表的文件路径:

          sampledb=# SELECT pg_relation_filepath('sampletbl');
          pg_relation_filepath
          ----------------------
          base/16384/18812
          (1 row)
          · 文件尺寸超过1GB后,新文件的产生规则:
            $ cd $PGDATA
            $ ls -la -h base/16384/19427*
            -rw------- 1 data/base/16384/19427
            -rw------- 1  data/base/16384/19427.1


            相关联的其它数据文件

            · 空闲空间地图和可见性地图(‘_fsm’和‘_vm’):

              $ cd $PGDATA
              $ ls -la base/16384/18751*
              -rw------- 1 base/16384/18751
              -rw------- 1 base/16384/18751_fsm
              -rw------- 1  base/16384/18751_vm

              · 当insert操作时空闲空间文件用来查看哪些数据块有空闲空间存放新行

              · 当进行vacuum操作时可见性地图文件用来提高操作的效率

              · 相关的三类文件在内部称为每个关系的分岔(fork);数据文件的fork号为0、空闲空间文件fork号为1,可见性地图文件的fork号为2。



              数据块内部结构

              · 数据文件内部布局

                  固定长度的页(或块),默认值为8192字节(8kb)

                  页面的内部布局取决于数据文件类型

              · 表中的页包含以下三种数据:

                  header data -由page header data结构定义的头数据在页面的开头分配。它的长度为24字节,包含有关该页的一般信息。结构的主要变量如下页所述。

                  line pointer(s) -行指针为4字节长,并保存指向每个堆行的指针。它也被称为项指针。行指针形成一个简单的数组,它起到元组索引的作用。每个索引从1开始按顺序编号,称为偏移量编号。当一个新的行被添加到页面中时,一个新的行指针也被推到数组中以指向新的行

                  heap tuple(s) -堆元组(行)是记录数据本身。它们从页面底部开始按顺序堆叠。因为PostgreSQL需要同时了解并发控制(CC)和WAL。


              INSERT操作

              · Writing Heap Tuples:

              UPDATE操作

              · 更新一行记录:

              update操作时,数据库的操作过程是先delete后insert,被删除的行空间不会立刻释放,vacuum操作时会释放。

              读操作

              · Reading Heap Tuples:




              以上就是Part 15 - PostgreSQL 数据文件和块存储结构 的内容,欢迎进群一起探讨交流
              QQ交流群:752027153
              微信交流群:联系客服拉你进微信PG交流群
              钉钉交流群:35822460,钉钉群专门有视频讲解










              相关阅读:

              从小白到专家 PG技术大讲堂 - Part 9:PG实例连接访问控制
              从小白到专家 PG技术大讲堂 - Part 10:PostgreSQL数据库管理
              从小白到专家 PG技术大讲堂 - Part 11:PostgreSQL控制文件作用与管理
              PostgreSQL技术大讲堂 - 第12讲:WAL作用与管理
              PostgreSQL技术大讲堂 - 第13讲:Full-Page Writes 全页写
              PostgreSQL技术大讲堂 - 第14讲:检查点

              蓝蓝的天

              -->> 联系客服,进群或领取文档资料

              文章转载自北京CUUG,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

              评论