postgresql 几次更新后出现意外的死元组数

wmvff8tz  于 2023-06-22  发布在  PostgreSQL
关注(0)|答案(1)|浏览(215)

我有一个关于PGSQL中更新场景后的死元组数量的问题。
由于PGSQL中的MVCC协议,许多更新导致表膨胀。我们可以用表中的死元组的数目来跟踪这个。在下面的场景中,我无法给予下面场景中死元组的数量的任何意义。
我正在使用以下测试用例更新“pgbench_accounts”表:
首先,我事先关闭了系统中的自动真空。...=更改系统将自动真空设置为关闭;...=# select pg_reload_conf();
然后我加载pgbench表。> pgbench -i --现在,pgbench_accounts有100.000元组
然后我更新随机生成的元组如下:>pgbench -t10000 -fupdate-only -n

update-only tx is as the following:
   \set aid random(1, 100000 * :scale)
   \set delta random(-5000, 5000)
   BEGIN;
   UPDATE pgbench_accounts SET abalance = abalance + :delta WHERE aid = :aid;
   END;

正如你所猜测的,我想用上面所示的一系列简单的更新tx来更新10.000个元组。
在过程结束后,我看到:9543更新元组。这似乎没问题,因为有些元组会更新两次或更多次。问题是我只看到3277个死元组。
虽然我关闭了autovacuum,一些死元组消失了。这是怎么发生的呢?我期待看到,至少相同数量的更新元组?

anauzrmj

anauzrmj1#

可能不是所有的更新都被计算在内(统计数据不一定100%准确),但更有可能的是,这种差异可以用HOT updates来解释。
如果块中还有空间,并且您没有更新索引列,PostgreSQL可以使用HOT更新,而不需要修改索引。HOT更新中的死元组不需要VACUUM进行清理。任何SELECT或其他声明(在您的情况下:UPDATE)可以抓取页面上的一个简短的锁并重新组织它,摆脱死元组。
您可以使用

SELECT n_tup_upd, n_tup_hot_upd
FROM pg_stat_all_tables
WHERE relname = 'pgbench_accounts';

相关问题