在我们的一些系统上运行vacuum
需要3秒来处理一个空表:
create table t (c int);
vacuum t; -- 3 seconds
vacuum t; -- 3 seconds
vacuum t; -- 3 seconds
...
在我的本地安装上,它只需要几毫秒。为什么在我们的一些系统上这么慢?可能是什么原因?我试图通过使用pg_stat_progress_vacuum
找到什么使vacuum
停止,但停止的vacuum
没有显示在那里。
我的一个想法是,在这些系统上有许多表分区。举个例子:
select count(*) from pg_class; -- 1.903.740
select count(*) from pg_class WHERE relkind = 'r'; -- 362.800
这可能是原因吗?我如何找到并修复原因?这会延迟自动真空,因为对于所有这些表分区(99.9%都是完全冻结的数据或空分区),防止卷取的真空需要太长时间,而每个分区需要几秒钟,而实际上只需要几毫秒。
1条答案
按热度按时间fnvucqvd1#
尝试运行
vacuum verbose t
,它会给予你一些细节,包括时间