Postgres 13中用于FILLFACTOR调优的平均行大小快速估算
Postgres 13 FILLFACTOR调优行大小估算方案
高性能估算方法(毫秒级返回,准确率满足调优需求)
你之前测试的三种方案都需要扫描表数据,所以存在速度慢、采样准确率不稳定的问题,推荐直接用PostgreSQL内置的统计元数据计算,不需要访问业务表数据,无额外开销:
- 方案1:
pg_class系统表直接计算(最匹配FILLFACTOR调优场景)
这个方案用预统计的堆表总大小和活元组数量计算平均行大小,包含行头、页对齐填充、死元组占用等实际磁盘开销,和FILLFACTOR的页级空间分配逻辑完全对齐:
如果统计信息过旧,先手动执行一次SELECT relname AS 表名, reltuples::BIGINT AS 估算活元组数量, ROUND(relpages * 8192.0 / reltuples, 2) AS 平均行大小_字节 FROM pg_class WHERE relname = '你的目标表名' AND relkind = 'r';ANALYZE 你的目标表名更新即可,不需要扫描全表。 - 方案2:
pg_stats视图取预计算平均宽度(适合纯数据行大小统计)
如果你需要排除死元组、页填充的影响,取纯数据的平均行大小,可以直接查ANALYZE预采样的统计结果:SELECT avg_width AS 平均数据行大小_字节 FROM pg_stats WHERE tablename = '你的目标表名' AND attname = '*';
调优指标选择建议
直接选用pg_class计算的平均行大小即可,这个值直接反映了当前表配置下,每行在数据页中的实际占用,你可以用这个值快速估算每个8KB默认页可以存放多少行,以及设置对应FILLFACTOR后预留的更新空间是否足够减少页面分裂,完全匹配调优目标。
索引、TOAST大小统计规则
- 索引不需要纳入统计:FILLFACTOR是堆表、索引分别配置的参数,调优表的FILLFACTOR只需要统计堆表自身的行大小即可,索引的FILLFACTOR调优可单独计算索引页的占用。
- TOAST不需要额外纳入统计:超长字段存到TOAST表后,堆表仅存储18字节的TOAST指针,这部分已经包含在堆表的行大小统计值中,TOAST数据本身不会存放在堆表的数据页,不会影响堆表的FILLFACTOR配置,除非你需要单独调优TOAST表的参数,否则不需要统计TOAST总大小。
内容的提问来源于stack exchange,提问作者Morris de Oryx
相关产品推荐
相关产品推荐

