这是我参与8月更文挑战的第27天,活动详情查看:8月更文挑战
本文旨在介绍pg_relation_size,pg_table_size,pg_indexes_size,pg_total_relation_size之间的关系。
先通过一个例子来直观的展现一下他们的区别和联系。
存在一张带索引的表t,OID为16384,与该表相关联的TOAST表的OID为16387。
select pg_relation_size(16384) ,
pg_relation_size(16384, 'main') as main,
pg_relation_size(16384, 'fsm') as fsm,
pg_relation_size(16384, 'vm') as vm,
pg_relation_size(16384, 'init') as init,
pg_total_relation_size(16387) as toast,
pg_table_size(16384),
pg_indexes_size(16384),
pg_total_relation_size(16384);
pg_relation_size | main | fsm | vm | init | toast | pg_table_size | pg_indexes_size | pg_total_relation_size |
---|---|---|---|---|---|---|---|---|
106496 | 106496 | 24576 | 8192 | 0 | 4186112 | 4325376 | 114688 | 4440064 |
pg_relation_size不加参数,默认就是查的表的数据文件大小,单位字节。
pg_relation_size加参数main,也是查的表的数据文件大小,单位字节。
pg_relation_size加参数fsm,查的表的fsm文件大小,单位字节。FSM是PG的空闲空间映射。
pg_relation_size加参数vm,查的表的vm文件大小,单位字节。VM是PG的可见性映射。
pg_relation_size加参数init,查的表的init文件大小,单位字节。每一个不被日志记录的表以及在这类表上的每一个索引,都有一个初始化分支,init就是代表这类内容。
pg_table_size,查的表的数据文件,fsm文件,vm文件,init文件,toast表的总大小,单位字节。
pg_indexes_size,查的表上索引文件的大小,单位字节。
pg_total_relation_size查询的是表的总大小,也就是表的数据文件,fsm文件,vm文件,init文件,索引文件,toast表的总大小,单位字节。
每个表和索引都存储在独立的文件里。对于普通对象,这些文件以表或索引的filenode号命名,它可以在pg_class的relfilenode列中找到。相关的数据文件存放在data目录的base目录中。base目录的一级目录是数据库的id号,里边就是数据库中一个个对象的relfilenode。在表或者索引超过1GB之后,这些文件就被划分成默认1GB大小的文件。第一个文件的文件名和文件node值相同;随后的段被命名为filenode.1、filenode.2等等。 注意: relfilenode不一定等于表的oid!尤其是表北执行过vacuum full后。