

Part 15:数据文件和块存储结构
| 内容1 | 表的OID与数据文件对应关系 |
| 内容2 | PostgreSQL数据文件存储方式 |
| 内容3 | 数据文件、空闲空间地图和可见性地图 |
| 内容4 | 块空间使用方法 |
对象OID与数据文件对应关系
· 作为数据库对象的表和索引在内部由各个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 -labase/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_classWHERE 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)
$ 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:


相关阅读:

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




