PostgreSQL多次更新后死元组数量异常问题咨询
关于PostgreSQL更新场景死元组数量的疑问解答
核心原因:你查询的是统计估计值,而非精确死元组数量
你大概率是通过pg_stat_user_tables视图中的n_dead_tup字段查看死元组数量,但这个字段的值是PostgreSQL通过采样分析得到的估计值,并非实时精确计数:
- 这个统计数据默认由autovacuum自动更新,或者手动执行
ANALYZE时更新 - 你已经关闭了autovacuum,且没有手动触发
ANALYZE,所以视图中的死元组数量没有同步真实的死元组变化,自然和预期不符
如何获取精确的死元组数量
要查看表中真实的死元组数量,需要使用pgstattuple扩展:
- 先创建扩展:
CREATE EXTENSION pgstattuple; - 查询精确数据:
SELECT * FROM pgstattuple('pgbench_accounts');
其中的dead_tuple_count字段就是真实的死元组数量,你会发现这个数值和总更新次数(10000次)接近——因为PostgreSQL的MVCC机制下,每次更新操作都会生成一个新元组,并将旧元组标记为死元组,哪怕是重复更新同一个元组,每次更新都会新增一个死元组。
补充说明:关于“更新的元组数量”的误解
你提到“共更新了9543个元组”,这里的9543是指被更新的不同元组的数量,而总更新操作是10000次。真实的死元组数量应该等于总更新次数(10000),因为每一次更新都会产生一个死元组,和是否重复更新同一个元组无关。
内容的提问来源于stack exchange,提问作者utku kalay
相关产品推荐
相关产品推荐

