【PostgreSQL的表文件以及TOAST表文件对应关系】

一、表和表文件对应关系

表和索引属于数据库对象,在pg_calss里都有相应的oid与之对应。
每个表都有与之相关的两个关联文件,为_fsm和_vm,是空闲空间映射和可见性映射文件。表的三个文件也被称为相应关系的分支(fork),空闲空间映射是表或者数据文件的第一个分支(分支编号为1),可见性映射是数据文件的第二个分支(分支编号为2),数据文件的分支标编号为0。

表或索引对象被创建后会生成以relfilenode编号命名的数据文件。该文件有1G的大小限制,超过1G或生成新的文件(文件名后边加数字编号):PostgreSQL会创建并使用一个名为relfilenode.1的新文件,如果新文件也满了,则会创建下一个名为relfilenode.2的新文件,以此类推。实际上,1GB只是默认的段尺寸。段尺寸可以在编译PostgreSQL时使用配置选项–with-segsize进行调整。

表和索引的relfilenode值会被一些命令(例如truncate,reindex,cluster)所改变,执行truncate后,会为表分配一个新的relfilenode,删除旧的数据文件,并创建一个新的数据文件。如例子所示,65571是原本的表文件,65574是新的表文件,但truncate之后表的oid是不会发生变化的。

 

【PostgreSQL的表文件以及TOAST表文件对应关系】_第1张图片

【PostgreSQL的表文件以及TOAST表文件对应关系】_第2张图片

在9.0或者更高的版本,用函数pg_relation_filepath能根据oid或者名称返回关系对应的文件路径
使用方法图中也有演示:

select pg_relation_filepath('表名');

二、表和TOAST表文件对应关系

TOAST是“The Oversized-Attribute Storage Technique”的缩写,主要用于存储一个大字段的值。在PG中,页是数据在文件存储中的基本单位,其大小是固定的且只能在编译期指定,之后无法修改,默认的大小为8KB。对于很长的行数据,PG就会启动TOAST,具体就是采用压缩和切片的方式。实际数据存储在另一张系统表的多个行中,这张表就叫TOAST表,这种存储方式叫行外存储。
在PG中每个表字段有四种TOAST的策略,可以参考 http://postgres.cn/docs/12/storage-toast.html


如图是一张测试表,interger默认TOAST策略为plain,而text为extended。如果表中有字段需要TOAST,那么系统会自动创建一张TOAST表负责行外存储。(请注意表结构中的oid列无特殊含义,是以前测试所创建的一个列名)

【PostgreSQL的表文件以及TOAST表文件对应关系】_第3张图片

通过pg_class可以看到tab_ysl这张表的oid为41073,其对应TOAST表的oid为41076

【PostgreSQL的表文件以及TOAST表文件对应关系】_第4张图片

则对应的TOAST表为pg_toast.pg_toast_41073(注意TOAST表不在当前schema下,在pg_toast的模式下,以pg_开头的模式名都是保留给系统使用的)

【PostgreSQL的表文件以及TOAST表文件对应关系】_第5张图片


可以看到表的实际两个文件都存在

【PostgreSQL的表文件以及TOAST表文件对应关系】_第6张图片


插入测试数据进行测试,可以看到插入一条如图数据时,TOAST表里并无记录。因为name列只有10个字符,所以没有压缩,也没有行外存储。

【PostgreSQL的表文件以及TOAST表文件对应关系】_第7张图片


继续进行测试,每次把name列的长度增长一倍,一直循环更新,直到TOAST表里有记录。

【PostgreSQL的表文件以及TOAST表文件对应关系】_第8张图片

【PostgreSQL的表文件以及TOAST表文件对应关系】_第9张图片

此时可以看到,name的长度为327680,超过了8k的页面大小,TOAST表里的两条记录长度都是略小于2K,这是因为text类型的extended策略下,先启用了压缩,然后才使用行外存储。

【PostgreSQL的表文件以及TOAST表文件对应关系】_第10张图片

你可能感兴趣的:(运维,PostgreSQL,postgresql,数据库,database,运维)