今天我注意到保存操作到一个表是如此缓慢。我运行了查询select n_live_tup, n_dead_tup, relname from pg_stat_all_tables
,发现我的表有3336个n_live_tup
和46508837个n_dead_tup
。我想这是因为几乎每分钟都有UPSERT操作。我试着在这个表上运行VACUUM FULL
(在我停止这个表的所有操作之前),但是n_dead_tup
仍然是一样的。VACUUM FULL
花了大约1分钟,成功完成。但是为什么n_dead_tup
和表的大小仍然相同呢?
1条答案
按热度按时间lmvvr0a81#
您可以找到
VACUUM
无法清理this article中的死元组的可能原因。VACUUM (FULL)
也是如此,尽管它的操作方式不同。1.有一个长时间运行的事务,它要么有一个事务ID(它修改了一些东西),要么在
REPEATABLE READ
或SERIALIZABLE
隔离级别上运行。请注意,这些事务将阻止VACUUM (FULL)
删除死元组 *,即使它们根本没有触及表 *。1.可能存在过时的复制插槽。检查
pg_replication_slots
是否有未激活的插槽。1.可能存在孤立的准备好的事务;检查
pg_prepared_xacts
。1.可能有一个带有
not_standby_feedback = on
的备用服务器正在运行一个很长的查询,或者有一个很旧的REPEATABLE READ
事务。