pg_table_size函数是否包含死元组?需每次执行vacuum获取准确表大小吗?
PostgreSQL pg_table_size函数常见疑问解答
疑问1:pg_table_size函数的统计结果是否包含死元组?
- 是,
pg_table_size的统计结果会包含未被清理的死元组占用的空间。 - 该函数统计的是表的主数据段、关联TOAST表、空闲空间映射(FSM)、可见性映射(VM)总共占用的物理磁盘空间。死元组被标记失效后,只要还没有被vacuum回收释放,就仍然占据物理磁盘空间,自然会被纳入统计范围。
疑问2:如果统计结果包含死元组,是否需要每次执行vacuum才能获取精准的表大小数据?
- 不需要。
pg_table_size读取的是文件系统层面的实际磁盘占用,数值是实时准确的,不需要依赖vacuum更新统计信息就能拿到正确结果。 - 只有你需要统计表内有效活元组的实际占用大小时,才有两种选择:
- 先执行
VACUUM FULL(普通VACUUM只会标记空间可复用,不会释放给操作系统,所以pg_table_size不会变小)清理死元组并释放磁盘空间后,再调用pg_table_size统计 - 直接通过系统表的统计信息估算有效数据大小,不需要执行vacuum
- 先执行
内容的提问来源于stack exchange,提问作者Fabrice Chapuis
相关产品推荐
相关产品推荐

