PostgreSQL仅做插入等操作时pg_class.reltuples估算行数是否准确?
结论
在你描述的纯分析场景下,绝大多数时候reltuples返回的行数估算都是准确的,仅存在极少量例外情况。
不同操作下的准确性说明
- CTAS(Create table as select)建表后:PostgreSQL 执行 CTAS 完成时会直接把实际写入的行数同步到
pg_class.reltuples字段,此时查询得到的数值是100%准确的,无任何偏差。 - 插入操作后:如果你是用
COPY、INSERT ... SELECT这类分析场景常用的批量写入操作导入数据,PostgreSQL 11及以上版本会在批量写入完成后自动更新reltuples,此时返回的值也是准确的;如果是零散小批次插入,还没触发统计信息自动更新前,reltuples会存在滞后,手动执行ANALYZE mytable后即可同步为最新的准确值。由于分析场景几乎不会用到零散小插入,实际使用中基本不会遇到这类偏差。 - 无UPDATE/DELETE操作的优势:普通业务场景下
reltuples不准的核心原因之一是UPDATE/DELETE产生的死元组未被vacuum清理,统计值没有扣除死元组数量,你这个场景完全没有这两类操作,也就不存在死元组带来的统计偏差问题。
需注意的例外
如果你的数据库里多个schema下存在同名表mytable,你当前使用的SQL没有限定schema,可能会查询到其他同名表的统计值,导致结果不符合预期,建议改成如下写法更稳妥:
SELECT reltuples AS estimate FROM pg_class c JOIN pg_namespace n ON c.relnamespace = n.oid WHERE relname = 'mytable' AND n.nspname = '你的表所属的schema名';
内容的提问来源于stack exchange,提问作者Pankaj Lal
相关产品推荐
相关产品推荐

