PostgreSQL具有在命令执行过程中报告某些命令进度的能力。 目前,支持进度报告的命令只有CREATE INDEX
、VACUUM
和CLUSTER
。未来可能还会扩展。
每当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 的阶段
阶段 | 描述 |
---|---|
初始化 |
CREATE INDEX 或REINDEX 正在准备创建索引。 这个阶段预计会非常短暂。
|
构建前等待读写器 |
CREATE INDEX CONCURRENTLY 或REINDEX CONCURRENTLY 正在等待有可能看到表的写锁的事务完成。 当不在并发模式时,这个阶段会被跳过。lockers_total 、 lockers_done 和 current_locker_pid 列包含了这个阶段的进度信息。
|
新建索引 |
索引是由访问方法专用代码建立的。 在这一阶段,支持进度报告的访问方法填写自己的进度数据,子阶段在这一栏中表示。 通常情况下,blocks_total 和blocks_done 将包含进度数据,也可能包含tuples_total 和tuples_done 。
|
在验证前等待读写器 |
CREATE INDEX CONCURRENTLY 或REINDEX CONCURRENTLY 正在等待有可能写入表的事务完成写锁的事务。当不在并发模式时,这个阶段会被跳过。lockers_total 、 lockers_done 和 current_locker_pid 列包含了这个阶段的进度信息。
|
索引验证:扫描索引 |
CREATE INDEX CONCURRENTLY 正在扫描索引,搜索需要验证的图元组。如果不是在并发模式下,这个阶段会被跳过。列 blocks_total (设置为索引的总大小)和 blocks_done 包含了这个阶段的进度信息。
|
指数验证:排序元组 |
CREATE INDEX CONCURRENTLY 正在对索引扫描阶段的输出进行排序。
|
索引验证:扫描表 |
CREATE INDEX CONCURRENTLY 正在扫描表,以验证前两个阶段收集的索引图元。当不在并发模式时,这个阶段被跳过。blocks_total 列(设置为表的总大小)和blocks_done 列包含这个阶段的进度信息。
|
等待旧照 |
CREATE INDEX CONCURRENTLY 或REINDEX CONCURRENTLY 正在等待可能看到表的事务释放快照。 当不处于并发模式时,这个阶段会被跳过。 lockers_total 、lockers_done 和 current_locker_pid 列包含了这个阶段的进度信息。
|
标记 dead之前等待readers |
REINDEX CONCURRENTLY 等待表上有读锁的事务完成后,再将旧索引标记为死索引。当不在并发模式时,这个阶段被跳过。lockers_total 、lockers_done 和 current_locker_pid 列包含了这个阶段的进度信息。
|
在 dropping之前等待readers |
REINDEX CONCURRENTLY 等待表上有读锁的事务完成后,再丢弃旧索引。当不在并发模式时,这个阶段被跳过。列 lockers_total 、lockers_done 和 current_locker_pid 包含了这个阶段的进度信息。
|
只要VACUUM
正在运行,每一个当前正在清理的后端(包括autovacuum工作者进程)在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 | 被vacuum的表的OID。 |
phase | text | vacuum的当前处理阶段。请参考表 27.25。 |
heap_blks_total | bigint |
该表中堆块的总数。这个数字在扫描开始时报告,之后增加的块将不会(并且不需要)被这个VACUUM 访问。
|
heap_blks_scanned | bigint |
被扫描的堆块数量。由于可见性映射被用来优化扫描,一些块将被跳过而不做检查,被跳过的块会被包括在这个总数中,因此当清理完成时这个数字最终将会等于heap_blks_total 。仅当处于扫描堆 阶段时这个计数器才会前进。
|
heap_blks_vacuumed | bigint |
被清理的堆块数量。除非表没有索引,这个计数器仅在处于清理堆 阶段时才会前进。不包含死亡元组的块会被跳过,因此这个计数器可能有时会向前跳跃一个比较大的增量。
|
index_vacuum_count | bigint | 已完成的索引清理周期数。 |
max_dead_tuples | bigint | 在需要执行一个索引清理周期之前我们可以存储的死亡元组数,取决于maintenance_work_mem。 |
num_dead_tuples | bigint | 从上一个索引清理周期以来收集的死亡元组数。 |
表 27.25. VACUUM的阶段
阶段 | 描述 |
---|---|
初始化 |
VACUUM 正在准备开始扫描堆。这个阶段应该很简短。
|
扫描堆 |
VACUUM 正在扫描堆。如果需要,它将会对每个页面进行修建以及碎片整理,并且可能会执行冻结动作。heap_blks_scanned 列可以用来监控扫描的进度。
|
清理索引 |
VACUUM 当前正在清理索引。如果一个表拥有索引,那么每次清理时这个阶段会在堆扫描完成后至少发生一次。如果maintenance_work_mem不足以存放找到的死亡元组,则每次清理时会多次清理索引。
|
清理堆 |
VACUUM 当前正在清理堆。清理堆与扫描堆不是同一个概念,清理堆发生在每一次清理索引的实例之后。如果heap_blks_scanned 小于heap_blks_total ,系统将在这个阶段完成之后回去扫描堆;否则,系统将在这个阶段完成后开始清理索引。
|
清除索引 |
VACUUM 当前正在清除索引。这个阶段发生在堆被完全扫描并且对堆和索引的所有清理都已经完成以后。
|
截断堆 |
VACUUM 正在截断堆,以便把关系尾部的空页面返还给操作系统。这个阶段发生在清除完索引之后。
|
执行最后的清除 |
VACUUM 在执行最终的清除。在这个阶段中,VACUUM 将清理空闲空间映射、更新pg_class 中的统计信息并且将统计信息报告给统计收集器。当这个阶段完成时,VACUUM 也就结束了。
|
每当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
or writing new heap 时才会前进。
|
heap_tuples_written | bigint |
写入的堆元组的数量。
这个计数器只有在阶段为
seq scanning heap ,
index scanning heap
or writing new heap 时才会前进。
|
heap_blks_total | bigint |
表中的堆块总数。 这个数字是在seq扫描堆 的开始时报告的。
|
heap_blks_scanned | bigint |
扫描的堆块数量。 这个计数器只有在阶段为seq扫描堆 时才会前进。
|
index_rebuild_count | bigint |
重建的索引数。 该计数器仅在重建索引 阶段时才会前进。
|
表 27.27. CLUSTER 和 VACUUM FULL 阶段
阶段 | 描述 |
---|---|
初始化 | 该命令准备开始扫描堆栈。 这个阶段预计会非常短暂。 |
seq扫描堆 | 该命令目前采用顺序扫描的方式对表进行扫描。 |
索引扫描堆 |
CLUSTER 目前正在使用索引扫描表。
|
元组排序 |
CLUSTER 目前正在对元组进行排序。
|
新写入堆 |
CLUSTER 目前正在编写新的堆。
|
交换关系文件 | 目前,该命令正在将新建立的文件调换到位。 |
重建索引 | 该命令目前正在重建一个索引。 |
清理 |
该命令正在执行最后的清理工作。 当此阶段完成后,CLUSTER 或VACUUM FULL 将结束。
|