You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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回收。

关键区别拆解

  1. 计数性质不同

    • n_tup_del是永久累计值,反映表生命周期内的总删除操作规模,不会因后续清理操作变化。
    • n_dead_tup是实时状态值,随死元组的产生和清理动态变化。
  2. 统计范围不同

    • n_tup_del统计所有被删除操作触发的元组(无论是否已被清理)。
    • n_dead_tup只统计当前留存于磁盘、未被VACUUM回收的死元组。
  3. 重置/变化逻辑不同

    • n_tup_del仅能通过pg_stat_reset()重置,否则持续递增。
    • n_dead_tup在执行VACUUM(包括普通VACUUM或VACUUM FULL)后会被清零或大幅减少——只要没有活跃事务需要读取这些死元组,VACUUM就会回收其空间并移除死元组标记。

示例场景

假设某表初始状态为0数据:

  1. 执行DELETE FROM tbl WHERE id < 100:n_tup_del +=100,n_dead_tup=100。
  2. 执行VACUUM tbl:n_dead_tup变为0,n_tup_del仍为100。
  3. 执行UPDATE tbl SET name = 'new' WHERE id <50:n_tup_del +=50(每个UPDATE对应一条旧元组删除),n_dead_tup=50。
  4. 再次执行VACUUM tbl:n_dead_tup回到0,n_tup_del保持150。

内容的提问来源于stack exchange,提问作者Mano

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 12:35:03