查询PG数据库表大小的方法和几个相关函数之间的差别

1,392 阅读2分钟

这是我参与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_sizemainfsmvminittoastpg_table_sizepg_indexes_sizepg_total_relation_size
1064961064962457681920418611243253761146884440064

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后。