0

如果我理解正确,在 MVCC(多版本并发控制)下,死元组会留在页面中,直到真空进入并将它们标记为“未使用”,直到“真空已满”进入并重新组织它们以对空间进行碎片整理 - - 所以我们为相同的数据使用更少的空间。

我有一张桌子,在一个尚未完成的环境中vacuum full

SELECT relpages, reltuples from pg_class where relname='pg_toast_16450';
 relpages  |  reltuples
-----------+--------------
 544447814 | 6.394397e+06

在另一个环境中经历过vacuum full

SELECT relpages, reltuples from pg_class where relname='pg_toast_16450';
 relpages |  reltuples
----------+--------------
  2476625 | 4.439228e+06

看起来relpages确实大幅下降,这符合我的理解。然而,reltuples没有。(relpages 有 250 倍的变化,而 reltuples 只有 1.33 倍)这是否意味着reltuples不包括死元组?如果是这种情况,reltuples用于设计查询计划的查询计划器是否有办法解决死元组?

4

1 回答 1

1

reltuples是对表中活动行数的估计。正如文件所说,

它由VACUUMANALYZE和一些 DDL 命令(例如CREATE INDEX )更新。

因此,如果最后一个这样的命令(可能由 autovacuum 触发)已经在桌子上运行,那么这个数字总是会稍微偏离,并且VACUUM (FULL)会解决这个问题。

但是,还有第二件事要考虑,因为这是一个 TOAST 表:它可能包含一些属于表中死行的条目。死行的 TOAST 条目本身不必是死的,但VACUUM (FULL)不会复制它们,因此数量可以额外缩小。我怀疑这已经发生了,因为这个数字减少了超过我预期的 10%。

于 2022-01-31T19:24:26.957 回答