1

我最初认为n_dead_tupdead_tuple_count在 PostgreSQL 中给出相同的计数。但他们似乎不是。我不太明白到底是什么区别。

以下是我的观察:

  1. 创建了一个包含 10k 行的表。
  2. 更新了所有 10k 行。现在我有 10k 个死元组。

SELECT dead_tuple_count FROM public.pgstattuple('public.vacuum_test');

 dead_tuple_count 
------------------
            10002

select * from pg_stat_get_dead_tuples('18466');

 pg_stat_get_dead_tuples 
-------------------------
                   10002
  1. 我确实在桌子上吸满了吸尘器。正如预期的那样, dead_tuple_count 为 0。

SELECT dead_tuple_count FROM public.pgstattuple('public.vacuum_test');

 dead_tuple_count 
------------------
                0

但从ie仍然是 10002 n_dead_tuppg_stat_all_tablespg_stat_get_dead_tuples('18466')

select * from pg_stat_get_dead_tuples('18466');

 pg_stat_get_dead_tuples 
-------------------------
                   10002

我多次重复此过程,并观察到n_dead_tup每次更新后更新的元组数量都会添加到统计信息中。

那么这里到底在VACUUM做什么呢?n_dead_tup和和有什么区别dead_tuple_count

4

2 回答 2

4

pgstattuple扫描表格并计算实时结果。对于一张大桌子来说它可能会很慢,但会产生准确的结果。

直接或通过类似的功能访问pg_stat视图,pg_stat_get_dead_tuples使用由收集的最新数据ANALYZE。所以它可能已经过时了,特别是如果你刚刚做了很大的改变。但是,它的访问速度非常快。

如果你ANALYZE的表,统计数据将再次匹配,或关闭。它们通常不会完全相同,因为来自的统计数据ANALYZE只是估计值。

顺便说一句,是时候从 8.4 升级到最新版本了。

于 2014-11-21T01:59:47.673 回答
0

VACUUM FULL有点小错误,因为它不会重置那些统计计数器。一个普通人VACUUM会这样做。

于 2014-11-21T22:25:15.137 回答