PostgreSQL中pg_stat_all_tables的n_dead_tup与n_tup_del有何区别?
PostgreSQL中n_tup_del与n_dead_tup的核心差异及VACUUM影响
核心定义与差异
- n_tup_del:这是一个累计计数指标,记录自表创建以来,所有通过显式
DELETE操作删除的元组总数,同时包含UPDATE操作中被替换的旧元组(PostgreSQL的UPDATE本质是删除旧元组+插入新元组)。这个数值只会递增,除非手动执行pg_stat_reset()重置统计,否则永远不会减少。 - n_dead_tup:这是一个动态当前值指标,代表当前表中存在的未被清理的死元组数量。死元组包括:被
DELETE标记删除的元组、UPDATE产生的旧元组、事务异常终止后遗留的失效元组。这些元组仍占用磁盘空间,直到被VACUUM回收。
关键区别拆解
计数性质不同
- n_tup_del是永久累计值,反映表生命周期内的总删除操作规模,不会因后续清理操作变化。
- n_dead_tup是实时状态值,随死元组的产生和清理动态变化。
统计范围不同
- n_tup_del统计所有被删除操作触发的元组(无论是否已被清理)。
- n_dead_tup只统计当前留存于磁盘、未被
VACUUM回收的死元组。
重置/变化逻辑不同
- n_tup_del仅能通过
pg_stat_reset()重置,否则持续递增。 - n_dead_tup在执行
VACUUM(包括普通VACUUM或VACUUM FULL)后会被清零或大幅减少——只要没有活跃事务需要读取这些死元组,VACUUM就会回收其空间并移除死元组标记。
- n_tup_del仅能通过
示例场景
假设某表初始状态为0数据:
- 执行
DELETE FROM tbl WHERE id < 100:n_tup_del +=100,n_dead_tup=100。 - 执行
VACUUM tbl:n_dead_tup变为0,n_tup_del仍为100。 - 执行
UPDATE tbl SET name = 'new' WHERE id <50:n_tup_del +=50(每个UPDATE对应一条旧元组删除),n_dead_tup=50。 - 再次执行
VACUUM tbl:n_dead_tup回到0,n_tup_del保持150。
内容的提问来源于stack exchange,提问作者Mano
相关产品推荐
相关产品推荐

