我正在一张很大的 table 上抽真空。

当我运行它时,它说:

bacula=# VACUUM FULL VERBOSE file_partition_19
bacula-# ;
INFO:  vacuuming "public.file_partition_19"
INFO:  "file_partition_19": found 16242451 removable, 21024161 nonremovable row versions in 900380 pages
DETAIL:  0 dead row versions cannot be removed yet.
CPU 5.14s/14.42u sec elapsed 19.61 sec.
VACUUM
Time: 163784.767 ms
bacula=#

执行此操作时,它会相当快地显示到CPU行,然后等待很长时间才显示最后两行(+提示)。与163秒的“时间:”相比,这体现在时间差异上,即“经过的19.61秒”(显示是因为我设置了\timing on)。

虽然我没有给它们计时,但是两次都差不多了-启动命令,等待20秒,然后显示到“CPU”行,然后等待大约3分钟,然后打印其余部分。

这正常吗?为什么会这样呢?

最佳答案

它主要是重建表上的所有索引,这是必须要做的,因为基本上“VACUUM FULL”会完全重写表。如果从表中删除所有索引,则在“CPU”行之后几乎没有延迟。

AFAICT,CPU使用率行由通用例程打印,该例程在其他(非全)真空模式下可以完成大部分工作。在“VACUUM FULL”(真空已满)情况下,它是没有意义的。

如果您担心它花费的时间太长,建议您查看PostgreSQL Wiki中的“When to use VACUUM FULL and when not to”。当人们使用VACUUM FULL时,十分之九。实际上,他们不应该这样做。

关于postgresql - 为什么在 "done"之后真空吸尘器等待?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41730843/

10-15 19:38