死元组的数量是否可能小于PostgreSQL表中更新/删除的行数?

时间:2015-08-11 06:41:18

标签: database postgresql

我正在对我们的产品执行压力测试,其中将从多个数据库中的分区表和索引更新/删除大量行。我验证了计数,然后执行vacuum操作。

我观察到死元组的数量等于大多数情况下更新/删除的行数,这是预期的。 pg_stat_get_dead_tuples()pgstattuple()函数都返回了相同数量的死元组。据我所知,前一个函数返回估计的计数和后面的确切计数。

但是在一种情况下,发现死元组的数量小于更新行的数量。 表中更新的元组数为5000000。 pg_stat_get_dead_tuples()返回5000000作为死元组计数。 但是pgstattuple()只返回了4999552个计数。

这种行为可能是什么原因?这是预期的吗?

谢谢。

1 个答案:

答案 0 :(得分:1)

我认为答案在于HOT +碎片整理。

引自here

  

仅堆元组(HOT):该功能消除了冗余索引条目   并允许重复使用DELETEd或过时的UPDATEd占用的空间   元组   没有执行全桌真空。它通过允许单页真空吸尘来实现这一点,也称为" defragmentation"。

此外,

  

碎片整理:... 移动幸存的元组以合并所有   自由空间进入一个洞#34;。