28.4. 进度报告

PostgreSQL 可以在命令执行过程中报告某些命令的进度。当前,唯一支持进度报告的命令是VACUUM。将来可能会扩大。

28 .4.1. 真空进度报告

每当VACUUM运行时,pg_stat_progress_vacuum视图将为当前正在清理的每个后端(包括自动清理工作进程)包含一行。下表描述了将要报告的信息,并提供了有关如何解释它的信息。 VACUUM FULL当前不支持进度报告,并且在此视图中不会列出运行VACUUM FULL的后端。

表 28.21. pg_stat_progress_vacuum查看

ColumnTypeDescription
pidinteger后端的进程 ID。
datidoid此后端连接到的数据库的 OID。
datnamename此后端连接到的数据库的名称。
relidoid吸尘表的 OID。
phasetext当前真空处理阶段。参见Table 28.22
heap_blks_totalbigint表中的堆块总数。在扫描开始时报告此数字。此VACUUM不会(也不需要)访问以后添加的块。
heap_blks_scannedbigint扫描的堆块数。由于visibility map用于优化扫描,因此某些块将被跳过而不进行检查;跳过的块包含在该总数中,因此在完成抽真空后,该数字最终将等于heap_blks_total。仅当相位为scanning heap时,此计数器才会前进。
heap_blks_vacuumedbigint已清理的堆块数。除非表没有索引,否则该计数器仅在阶段为vacuuming heap时才前进。不包含无效 Tuples 的块将被跳过,因此计数器有时可能会以较大的增量向前跳跃。
index_vacuum_countbigint完成的分度真空循环数。
max_dead_tuplesbigint基于maintenance_work_mem,我们可以在执行索引真空循环之前可以存储的死 Tuples 数。
num_dead_tuplesbigint自上次索引真空周期以来收集的死 Tuples 数。

表 28.22. 真空阶段

PhaseDescription
initializingVACUUM正在准备开始扫描堆。预计此阶段将非常简短。
scanning heapVACUUM当前正在扫描堆。如果需要,它将修剪和整理每个页面的碎片,并可能执行冻结活动。 heap_blks_scanned列可用于监视扫描进度。
vacuuming indexesVACUUM当前正在清理索引。如果表有任何索引,则在完全扫描堆之后,每次清理至少会发生一次。如果maintenance_work_mem不足以存储找到的死 Tuples 数,则每个真空可能发生多次。
vacuuming heapVACUUM目前正在清理堆。清理堆与扫描堆不同,清理是在每个清理索引实例之后进行的。如果heap_blks_scanned小于heap_blks_total,则此阶段完成后,系统将返回扫描堆;否则,它将在此阶段完成后开始清理索引。
cleaning up indexesVACUUM目前正在清理索引。在完全扫描了堆并且对索引和堆进行了所有清理之后,就会发生这种情况。
truncating heapVACUUM当前正在截断堆,以便在与 os 的关系结束时返回空页。这在清理索引之后发生。
performing final cleanupVACUUM正在执行最终清理。在此阶段中,VACUUM将清理可用空间图,更新pg_class中的统计信息,并将统计信息报告给统计信息收集器。此阶段完成后,VACUUM将结束。