选择 打开 改范围 完整检索页
受支持版本: 当前版本 (18) / 17 / 16 / 15 / 14
开发版本: 19 / devel
不受支持的版本: 13 / 12 / 11 / 10
当前 PostgreSQL 版本不在支持生命周期内。
您可以参阅当前版本的对应页面,或其他在上面列出的活跃大版本。

27.4. 进度报告 #

PostgreSQL能够在某些命令执行期间报告其进度。目前,支持进度报告的命令只有CREATE INDEXVACUUMCLUSTER。未来可能会扩展此功能。

27.4.1. CREATE INDEX 进度报告 #

每当运行CREATE INDEXREINDEX时,pg_stat_progress_create_index视图将包含当前正在创建索引的每个后端的一行。 下面的表描述了将要报告的信息,并提供了关于如何解释它的信息。

Table 27.22. pg_stat_progress_create_index 视图

类型 描述
pid integer 后端的进程ID。
datid oid 后端连接到的数据库的OID。
datname name 后端连接到的数据库的名称。
relid oid 正在创建索引的表的OID。
index_relid oid 正在创建或重建索引的OID。在非并发 CREATE INDEX的时候,此为 0。
command text 在运行的命令: CREATE INDEX,CREATE INDEX CONCURRENTLY, REINDEX, 或 REINDEX CONCURRENTLY.
phase text 索引创建的当前处理阶段。 参见 Table 27.23
lockers_total bigint 在适用的情况下,需要等待的储物柜总数
lockers_done bigint 已经等待的储物柜数量。
current_locker_pid bigint 目前正在等待的储物柜的进程ID。
blocks_total bigint 本阶段要处理的区块总数。
blocks_done bigint 当前阶段已经处理的区块数量。
tuples_total bigint 当前阶段要处理的元组总数。
tuples_done bigint 在当前阶段已经处理的元组数量。
partitions_total bigint 在分区表上创建索引时,该列被设置为要在其上创建索引的分区总数。
partitions_done bigint 当在分区表上创建索引时,该列被设置为在其上建立索引的分区数。

Table 27.23. CREATE INDEX 的阶段

阶段 描述
initializing CREATE INDEXREINDEX正在准备创建索引。 这个阶段预计会非常短暂。
waiting for writers before build CREATE INDEX CONCURRENTLYREINDEX CONCURRENTLY正在等待有可能看到表的写锁的事务完成。 当不在并发模式时,这个阶段会被跳过。lockers_totallockers_donecurrent_locker_pid 列包含了这个阶段的进度信息。
building index 索引是由访问方法专用代码建立的。 在这一阶段,支持进度报告的访问方法填写自己的进度数据,子阶段在这一栏中表示。 通常情况下,blocks_totalblocks_done将包含进度数据,也可能包含tuples_totaltuples_done
waiting for writers before validation CREATE INDEX CONCURRENTLYREINDEX CONCURRENTLY正在等待有可能写入表的事务完成写锁的事务。当不在并发模式时,这个阶段会被跳过。lockers_totallockers_donecurrent_locker_pid 列包含了这个阶段的进度信息。
index validation: scanning index CREATE INDEX CONCURRENTLY正在扫描索引,搜索需要验证的元组。如果不是并发模式,则会跳过此阶段。列 blocks_total(设为索引总大小)和 blocks_done 包含该阶段的进度信息。
index validation: sorting tuples CREATE INDEX CONCURRENTLY正在对索引扫描阶段的输出进行排序。
index validation: scanning table CREATE INDEX CONCURRENTLY正在扫描表,以验证前两个阶段收集的索引元组。如果不是并发模式,则会跳过此阶段。blocks_total 列(设为表总大小)和 blocks_done 列包含该阶段的进度信息。
waiting for old snapshots CREATE INDEX CONCURRENTLYREINDEX CONCURRENTLY正在等待可能看到表的事务释放快照。 当不处于并发模式时,这个阶段会被跳过。 lockers_totallockers_donecurrent_locker_pid 列包含了这个阶段的进度信息。
waiting for readers before marking dead REINDEX CONCURRENTLY等待表上有读锁的事务完成后,再将旧索引标记为死索引。当不在并发模式时,这个阶段被跳过。lockers_totallockers_donecurrent_locker_pid 列包含了这个阶段的进度信息。
waiting for readers before dropping REINDEX CONCURRENTLY等待表上有读锁的事务完成后,再丢弃旧索引。当不在并发模式时,这个阶段被跳过。列 lockers_totallockers_donecurrent_locker_pid包含了这个阶段的进度信息。

27.4.2. VACUUM 进度报告 #

只要VACUUM正在运行,pg_stat_progress_vacuum视图就会为每个当前正在清理的后端(包括自动清理工作进程)包含一行。下表描述了将报告的信息,并说明如何解释这些信息。VACUUM FULL命令的进度通过pg_stat_progress_cluster报告,因为VACUUM FULLCLUSTER都会重写表,而常规的VACUUM只会原地修改表。参见Section 27.4.3

Table 27.24. pg_stat_progress_vacuum 视图

类型 描述
pid integer 后端的进程ID。
datid oid 后端连接到的数据库的OID。
datname name 后端连接到的数据库的名称。
relid oid 被vacuum的表的OID。
phase text vacuum的当前处理阶段。参见 Table 27.25
heap_blks_total bigint 该表中堆块的总数。这个数字在扫描开始时报告,之后增加的块将不会(并且不需要)被这个VACUUM访问。
heap_blks_scanned bigint 被扫描的堆块数量。由于可见性映射被用来优化扫描,一些块将被跳过而不做检查, 被跳过的块会被包括在这个总数中,因此当清理完成时这个数字最终将会等于heap_blks_total。 仅当处于scanning heap阶段时这个计数器才会前进。
heap_blks_vacuumed bigint 被清理的堆块数量。除非表没有索引,这个计数器仅在处于vacuuming heap阶段时才会前进。 不包含死亡元组的块会被跳过,因此这个计数器可能有时会向前跳跃一个比较大的增量。
index_vacuum_count bigint 已完成的索引清理周期数。
max_dead_tuples bigint 在需要执行索引清理周期之前可存储的死亡元组数据量,取决于maintenance_work_mem
num_dead_tuples bigint 自上一个索引清理周期以来收集到的死亡元组数据量。

Table 27.25. VACUUM的阶段

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

27.4.3. CLUSTER 进度报告 #

每当CLUSTERVACUUM FULL运行时,pg_stat_progress_cluster视图将包含当前正在运行的每一个后台的记录。下面的表格描述了将被报告的信息,并提供了关于如何解释这些信息的信息。

Table 27.26. pg_stat_progress_cluster 视图

类型 描述
pid integer 后端的进程ID。
datid oid 后端连接到的数据库的OID。
datname name 后端连接到的数据库的名称。
relid oid 被集群的表的OID。
command text 正在运行的命令。CLUSTERVACUUM FULL
phase text 当前处理阶段。参见Table 27.27
cluster_index_relid oid 如果正在使用索引对表进行扫描,这就是正在使用的索引的OID;否则为0。
heap_tuples_scanned bigint 扫描的堆元组数。 该计数器仅在阶段为seq scanning heapindex scanning heapwriting new heap 时才会递增。
heap_tuples_written bigint 写入的堆元组的数量。这个计数器只有在阶段为seq scanning heap,index scanning heapwriting new heap时才会前进。
heap_blks_total bigint 表中的堆块总数。 这个数字是在seq scanning heap的开始时报告的。
heap_blks_scanned bigint 扫描的堆块数量。该计数器仅在阶段为seq scanning heap时才会递增。
index_rebuild_count bigint 已重建的索引数。该计数器仅在rebuilding index阶段时才会递增。

Table 27.27. CLUSTER 和 VACUUM FULL 阶段

阶段 描述
initializing 该命令准备开始扫描堆栈。 这个阶段预计会非常短暂。
seq scanning heap 该命令目前采用顺序扫描的方式对表进行扫描。
index scanning heap CLUSTER目前正在使用索引扫描表。
sorting tuples CLUSTER目前正在对元组进行排序。
writing new heap CLUSTER目前正在编写新的堆。
swapping relation files 目前,该命令正在将新建立的文件调换到位。
rebuilding index 该命令目前正在重建一个索引。
performing final cleanup 该命令正在执行最后的清理工作。 当此阶段完成后,CLUSTERVACUUM FULL将结束。