28.4. 进度报告

28.4.1. VACUUM进度报告

PostgreSQL能够在命令执行期间报告某些命令的进度。目前,唯一支持 进度报告的命令是VACUUM。未来可能会添加更多命令支持。

28.4.1. VACUUM进度报告

每当VACUUM运行时, pg_stat_progress_vacuum视图将包含每个后端 (包括autovacuum工作进程)当前正在VACUUM的一行。下表描述了该报告视图提供的信息, 并提供相应的信息注解。VACUUM FULL当前不支持进度报告。运行 VACUUM FULL的后端将不会在此视图中列出。

表 28.21. pg_stat_progress_vacuum 视图

类型描述
pidinteger这个后端的进程ID。
datidoid这个后端连接到的数据库的OID。
datnamename这个后端连接到的数据库的名称。
relidoid当前被VACUUM的表的OID。
phasetext 当前VACUUM的处理阶段。详见表 28.22
heap_blks_totalbigint 当前被VACUUM的表堆数据块的总数。这个数字在扫描开始时被报告;之后增加的数据块 不会(也不必)被当前VACUUM访问。
heap_blks_scannedbigint 已扫描的堆数据块数。由于可见性图被用于优化 扫描,因此某些块将被忽略而不进行检查;跳过的块也被包括在这个总数中,所以当 VACUUM完成时,这个数字最终将等于heap_blks_total。这个计数 器只有在VACUUM的扫描堆阶段才会增长。
heap_blks_vacuumedbigint 已被VACUUM的堆数据块数。除非表中没有索引,否则这个计数器只有在VACUUM的 清理堆阶段才会增长。不包含任何死亡元组的数据块将被跳过,因 此该计数器的值有时会大幅跳跃式增加。
index_vacuum_countbigint 已完成的索引VACUUM数量。
max_dead_tuplesbigint 在必须执行一次索引VACUUM前可存储的死亡元组数量。 这基于maintenance_work_mem的值。
num_dead_tuplesbigint 自上一次索引VACUUM结束后,一共清理的死亡元组数量。

表 28.22. VACUUM 的阶段

阶段描述
初始化 VACUUM正在准备开始扫描堆。这个阶段应该很简短。
扫描堆 VACUUM正在扫描堆。如果需要,它将会对每个页面进行修建以及碎片整理,并且可能会执行冻结动作。heap_blks_scanned列可以用来监控扫描的进度。
清理索引 VACUUM当前正在清理索引。如果一个表拥有索引,那么每次清理时这个阶段会在堆扫描完成后至少发生一次。如果maintenance_work_mem不足以存放找到的死亡元组,则每次清理时会多次清理索引。
清理堆 VACUUM当前正在清理堆。清理堆与扫描堆不是同一个概念,清理堆发生在每一次清理索引的实例之后。如果heap_blks_scanned小于heap_blks_total,系统将在这个阶段完成之后回去扫描堆;否则,系统将在这个阶段完成后开始清理索引。
清除索引 VACUUM当前正在清除索引。这个阶段发生在堆被完全扫描并且对堆和索引的所有清理都已经完成以后。
截断堆 VACUUM正在截断堆,以便把关系尾部的空页面返还给操作系统。这个阶段发生在清除完索引之后。
执行最后的清除 VACUUM在执行最终的清除。在这个阶段中,VACUUM将清理空闲空间映射、更新pg_class中的统计信息并且将统计信息报告给统计收集器。当这个阶段完成时,VACUUM也就结束了。