27.4. 进度报告 #
PostgreSQL 能够在某些命令执行期间报告其进度。目前,支持进度报告的命令只有 CREATE INDEX、VACUUM 和 CLUSTER。未来可能会扩展此功能。
27.4.1. CREATE INDEX 进度报告 #
每当运行 CREATE INDEX 或 REINDEX 时,pg_stat_progress_create_index 视图将包含当前正在创建索引的每个后端的一行。下面的表描述了将要报告的信息,并提供了关于如何解释它的信息。
表 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 | 索引创建的当前处理阶段。参见表 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 | 当在分区表上创建索引时,该列被设置为在其上建立索引的分区数。 |
表 27.23. CREATE INDEX 阶段
| 阶段 | 描述 |
|---|---|
initializing |
CREATE INDEX 或 REINDEX 正在准备创建索引。这个阶段预计会非常短暂。
|
waiting for writers before build |
CREATE INDEX CONCURRENTLY 或 REINDEX CONCURRENTLY 正在等待持有写锁且可能看到该表的事务结束。当不在并发模式时,这个阶段会被跳过。lockers_total、lockers_done 和 current_locker_pid 列包含了这个阶段的进度信息。
|
building index |
索引是由访问方法专用代码建立的。在这一阶段,支持进度报告的访问方法填写自己的进度数据,子阶段在这一栏中表示。通常情况下,blocks_total 和 blocks_done 将包含进度数据,tuples_total 和 tuples_done 也可能包含进度数据。
|
waiting for writers before validation |
CREATE INDEX CONCURRENTLY 或 REINDEX CONCURRENTLY 正在等待持有写锁且可能写入该表的事务结束。当不在并发模式时,这个阶段会被跳过。lockers_total、lockers_done 和 current_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 CONCURRENTLY 或 REINDEX CONCURRENTLY 正在等待可能看到表的事务释放快照。当不处于并发模式时,这个阶段会被跳过。lockers_total、lockers_done 和 current_locker_pid 列包含了这个阶段的进度信息。
|
waiting for readers before marking dead |
REINDEX CONCURRENTLY 等待表上有读锁的事务完成后,再将旧索引标记为死索引。当不在并发模式时,这个阶段被跳过。lockers_total、lockers_done 和 current_locker_pid 列包含了这个阶段的进度信息。
|
waiting for readers before dropping |
REINDEX CONCURRENTLY 等待表上有读锁的事务完成后,再丢弃旧索引。当不在并发模式时,这个阶段被跳过。列 lockers_total、lockers_done 和 current_locker_pid 包含了这个阶段的进度信息。
|
27.4.2. VACUUM 进度报告 #
只要 VACUUM 正在运行,pg_stat_progress_vacuum 视图就会为每个当前正在清理的后端(包括自动清理工作进程)包含一行。下表描述了将报告的信息,并说明如何解释这些信息。VACUUM FULL 命令的进度通过 pg_stat_progress_cluster 报告,因为 VACUUM FULL 和 CLUSTER 都会重写表,而常规的 VACUUM 只会原地修改表。参见第 27.4.3 节。
表 27.24. pg_stat_progress_vacuum 视图
| 列 | 类型 | 描述 |
|---|---|---|
pid | integer | 后端的进程 ID。 |
datid | oid | 后端连接到的数据库的 OID。 |
datname | name | 后端连接到的数据库的名称。 |
relid | oid | 正在清理的表的 OID。 |
phase | text | 清理的当前处理阶段。参见表 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 | 自上一个索引清理周期以来收集到的死亡元组数量。 |
表 27.25. VACUUM 阶段
| 阶段 | 描述 |
|---|---|
initializing |
VACUUM 正在准备开始扫描堆。这个阶段应该很简短。
|
scanning heap |
VACUUM 正在扫描堆。如果需要,它将会对每个页面进行剪枝以及碎片整理,并且可能会执行冻结动作。heap_blks_scanned 列可以用来监控扫描的进度。
|
vacuuming indexes | VACUUM 当前正在清理索引。如果表有索引,每次清理都会在堆扫描完成后至少执行一次此阶段。如果 maintenance_work_mem(或者,对于自动清理,已设置的 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 进度报告 #
每当 CLUSTER 或 VACUUM FULL 运行时,pg_stat_progress_cluster 视图将为每个当前正在运行这两种命令之一的后端包含一行。下面的表格描述了将被报告的信息,并提供了关于如何解释这些信息的信息。
表 27.26. pg_stat_progress_cluster 视图
| 列 | 类型 | 描述 |
|---|---|---|
pid | integer | 后端的进程 ID。 |
datid | oid | 后端连接到的数据库的 OID。 |
datname | name | 后端连接到的数据库的名称。 |
relid | oid | 正在聚簇的表的 OID。 |
command | text |
正在运行的命令。CLUSTER 或 VACUUM FULL。
|
phase | text | 当前处理阶段。参见表 27.27。 |
cluster_index_relid | oid | 如果正在使用索引对表进行扫描,这就是正在使用的索引的 OID;否则为 0。 |
heap_tuples_scanned | bigint |
扫描的堆元组数。该计数器仅在阶段为 seq scanning heap、index scanning heap
或 writing new heap 时才会递增。
|
heap_tuples_written | bigint |
写入的堆元组的数量。这个计数器只有在阶段为 seq scanning heap、index scanning heap
或 writing new heap 时才会递增。
|
heap_blks_total | bigint |
表中的堆块总数。这个数字以 seq scanning heap 开始时的数量为准。
|
heap_blks_scanned | bigint |
扫描的堆块数量。该计数器仅在阶段为 seq scanning heap 时才会递增。
|
index_rebuild_count | bigint |
已重建的索引数。该计数器仅在 rebuilding index 阶段时才会递增。
|
表 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 |
该命令正在执行最后的清理工作。当此阶段完成后,CLUSTER 或 VACUUM FULL 将结束。
|