↑↓ 选择↵ 打开⌫ 切换范围完整搜索

PG.CENTER 连接 PostgreSQL 文档、百科与生态知识。由 Pigsty 维护。

支持中的版本: 当前版本 (18) / 17 / 16 / 15 / 14
开发中的版本: 19 / 20devel
已结束支持的版本: 13 / 12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0 / 8.4 / 8.3 / 8.2 / 8.1 / 8.0 / 7.4 / 7.3 / 7.2

28.2. 统计收集器 #

PostgreSQL 的统计收集器是一个支持收集和报告服务器活动信息的子系统。目前,对表和索引的访问会按磁盘块和行两种口径计数。每个表中的总行数,以及每个表的清理和分析操作的信息也被计数。它还可以统计对用户定义函数的调用和每个函数中花费的总时间。

PostgreSQL 也支持报告关于系统当前正在发生的情况的动态信息,例如其他服务器进程当前正在执行的确切命令,以及系统中存在哪些其他连接。此功能独立于收集器进程。

28.2.1. 统计信息收集配置 #

由于收集统计信息会增加查询执行的开销,因此可以配置系统是否收集信息。这由通常在 postgresql.conf 中设置的配置参数控制(有关设置配置参数的详细信息,请参阅第 20 章)。

参数 track_activities 启用对任意服务器进程当前执行命令的监控。

参数 track_counts 控制是否收集关于表和索引访问的统计信息。

参数 track_functions 启用对用户定义函数使用的跟踪。

参数 track_io_timing 启用对块读取和写入时间的监控。

参数 track_wal_io_timing 启用对 WAL 写入时间的监控。

通常,这些参数会设置在 postgresql.conf 中,以便它们适用于所有服务器进程,但也可以在单个会话中使用 SET 命令打开或关闭它们。(为防止普通用户隐藏其活动不被管理员发现,只有超级用户才能使用 SET 更改这些参数。)

统计收集器通过临时文件把收集到的信息传递给其他 PostgreSQL 进程。这些文件默认存放在由 stats_temp_directory 参数指定的目录中,即 pg_stat_tmp。为了获得更好的性能,可以把 stats_temp_directory 指向基于 RAM 的文件系统,以减少物理 I/O 需求。当服务器正常关闭时,统计信息数据的永久副本会存储在 pg_stat 子目录中,以便在服务器重启后保留这些统计信息。当服务器启动时执行恢复时(例如立即关闭后、服务器崩溃后以及进行时间点恢复时),所有统计计数器都会被重置。

28.2.2. 查看统计信息 #

有几个预定义视图列在表 28.1 中,可用于显示系统的当前状态。另有几个视图列在表 28.2 中,可用于显示统计信息收集的结果。或者,也可以像第 28.2.22 节中所述那样,使用底层的统计函数构建自定义视图。

当使用统计信息来监视收集到的数据时,重要的是要意识到信息不会立即更新。每个单独的服务器进程会在转为空闲之前把新的统计计数发送给收集器,因此仍在进行中的查询或事务不会影响显示的总计。并且,收集器本身最多每隔 PGSTAT_STAT_INTERVAL 毫秒才会发出一份新报告一次(除非在构建服务器时做过修改,否则为 500 毫秒)。因此,显示的信息会滞后于实际活动。然而,由 track_activities 收集的当前查询信息始终是最新的。

另一个重要点是,当要求服务器进程显示这些统计信息中的任何一种时,它会先取回收集器进程最近发出的报告,然后在当前事务结束之前,对所有统计视图和函数一直使用这一快照。因此,只要你继续当前事务,统计信息就会显示静态信息。类似地,在事务中第一次请求这类当前查询信息时,就会收集所有会话当前查询的信息,并且在整个事务期间显示的都是同一份信息。这是一个特性,而不是一个错误,因为它允许你对统计信息执行多个查询并对结果做关联,而不必担心数字在你眼前变化。但如果希望每个查询都看到新的结果,请确保在任何事务块之外执行这些查询。或者,也可以调用 pg_stat_clear_snapshot(),它会丢弃当前事务的统计快照(如果有)。下一次使用统计信息时,就会获取一个新的快照。

事务还可以在视图 pg_stat_xact_all_tables、pg_stat_xact_sys_tables、pg_stat_xact_user_tables 和 pg_stat_xact_user_functions 中看到自己的统计信息(这些统计信息尚未传送给收集器)。这些数字不像上面所述那样起作用;相反,它们在事务期间持续更新。

表 28.1 所列动态统计视图中的一些信息受到安全限制。普通用户只能查看其自身会话的全部信息(包括属于其所加入角色的会话)。对于其他会话的行,许多列将为空值。不过,会话的存在及其一般属性(例如会话用户和数据库)对所有用户都可见。超级用户和内置角色 pg_read_all_stats 的成员(另请参阅第 22.5 节)可以查看所有会话的全部信息。

表 28.1. 动态统计视图

视图名称描述
pg_stat_activity 每个服务器进程一行,显示与该进程当前活动相关的信息,例如状态和当前查询。有关详细信息,请参阅 pg_stat_activity。
pg_stat_replication每个 WAL 发送进程一行,显示有关复制到该发送进程所连接备库的统计信息。有关详细信息,请参阅 pg_stat_replication。
pg_stat_wal_receiver只有一行,显示 WAL 接收进程从其所连接服务器接收数据的统计信息。有关详细信息,请参阅 pg_stat_wal_receiver。
pg_stat_subscription每个订阅至少一行,显示有关订阅工作进程的信息。有关详细信息,请参阅 pg_stat_subscription。
pg_stat_ssl每个连接(常规连接和复制连接)一行,显示有关该连接上使用的 SSL 的信息。有关详细信息,请参阅 pg_stat_ssl。
pg_stat_gssapi每个连接(常规连接和复制连接)一行,显示有关该连接上使用的 GSSAPI 认证和加密的信息。有关详细信息,请参阅 pg_stat_gssapi。
pg_stat_progress_analyze每个正在运行 ANALYZE 的后端(包括自动清理工作进程)一行,显示当前进度。请参阅第 28.4.1 节。
pg_stat_progress_create_index每个正在运行 CREATE INDEX 或 REINDEX 的后端一行,显示当前进度。请参阅第 28.4.2 节。
pg_stat_progress_vacuum每个正在运行 VACUUM 的后端(包括自动清理工作进程)一行,显示当前进度。请参阅第 28.4.3 节。
pg_stat_progress_cluster每个正在运行 CLUSTER 或 VACUUM FULL 的后端一行,显示当前进度。请参阅第 28.4.4 节。
pg_stat_progress_basebackup每个正在流式传输基础备份的 WAL 发送进程一行,显示当前进度。请参阅第 28.4.5 节。
pg_stat_progress_copy每个正在运行 COPY 的后端一行,显示当前进度。请参阅第 28.4.6 节。

表 28.2. 已收集统计信息的视图

视图名称描述
pg_stat_archiver只有一行,显示有关 WAL 归档进程活动的信息。有关详细信息,请参阅 pg_stat_archiver。
pg_stat_bgwriter只有一行,显示有关后台写入器活动的信息。有关详细信息,请参阅 pg_stat_bgwriter。
pg_stat_wal只有一行,显示有关 WAL 活动的统计信息。有关详细信息,请参阅 pg_stat_wal。
pg_stat_database每个数据库一行,显示数据库范围的统计信息。有关详细信息,请参阅 pg_stat_database。
pg_stat_database_conflicts每个数据库一行,显示数据库范围内因备库上的恢复冲突而导致查询被取消的统计信息。有关详细信息,请参阅 pg_stat_database_conflicts。
pg_stat_all_tables 当前数据库中每个表一行,显示有关访问指定表的统计信息。详见 pg_stat_all_tables。
pg_stat_sys_tables和 pg_stat_all_tables 一样,但只显示系统表。
pg_stat_user_tables和 pg_stat_all_tables 一样,但只显示用户表。
pg_stat_xact_all_tables与 pg_stat_all_tables 相似,但只统计当前事务中截至目前执行的操作(这些操作尚未计入 pg_stat_all_tables 及相关视图)。此视图不包含存活行和死行数量以及清理、分析操作的列。
pg_stat_xact_sys_tables和 pg_stat_xact_all_tables 一样,但只显示系统表。
pg_stat_xact_user_tables和 pg_stat_xact_all_tables 一样,但只显示用户表。
pg_stat_all_indexes当前数据库中的每个索引一行,显示有关访问该特定索引的统计信息。有关详细信息,请参阅 pg_stat_all_indexes。
pg_stat_sys_indexes和 pg_stat_all_indexes 一样,但只显示系统表上的索引。
pg_stat_user_indexes和 pg_stat_all_indexes 一样,但只显示用户表上的索引。
pg_statio_all_tables当前数据库中的每个表一行,显示有关访问该特定表的 I/O 统计信息。有关详细信息,请参阅 pg_statio_all_tables。
pg_statio_sys_tables和 pg_statio_all_tables 一样,但只显示系统表。
pg_statio_user_tables和 pg_statio_all_tables 一样,但只显示用户表。
pg_statio_all_indexes当前数据库中的每个索引一行,显示有关访问该特定索引的 I/O 统计信息。有关详细信息,请参阅 pg_statio_all_indexes。
pg_statio_sys_indexes和 pg_statio_all_indexes 一样,但只显示系统表上的索引。
pg_statio_user_indexes和 pg_statio_all_indexes 一样,但只显示用户表上的索引。
pg_statio_all_sequences当前数据库中的每个序列一行,显示有关访问该特定序列的 I/O 统计信息。有关详细信息,请参阅 pg_statio_all_sequences。
pg_statio_sys_sequences和 pg_statio_all_sequences 一样,但只显示系统序列(目前没有定义系统序列,因此这个视图总是为空)。
pg_statio_user_sequences和 pg_statio_all_sequences 一样,但只显示用户序列。
pg_stat_user_functions每个被跟踪的函数一行,显示有关该函数执行的统计信息。有关详细信息,请参阅 pg_stat_user_functions。
pg_stat_xact_user_functions和 pg_stat_user_functions 相似,但是只统计在当前事务期间的调用(还没有被包括在 pg_stat_user_functions 中)。
pg_stat_slru每个 SLRU 一行,显示操作统计信息。有关详细信息,请参阅 pg_stat_slru。
pg_stat_replication_slots每个复制槽一行,显示有关复制槽使用情况的统计信息。有关详细信息,请参阅 pg_stat_replication_slots。

每个索引的统计信息对于判断哪些索引正在被使用以及它们有多有效尤其有用。

pg_statio_视图主要用于判断缓冲区缓存的有效性。如果实际磁盘读取次数远少于缓冲区命中次数,缓存就能满足大多数读取请求,而无需调用内核。不过,这些统计信息并不能反映全部情况:由于 PostgreSQL 处理磁盘 I/O 的方式,不在 PostgreSQL 缓冲区缓存中的数据仍可能驻留在内核的 I/O 缓存中,因而仍可在不执行物理读取的情况下取得。对于希望更详细地了解 PostgreSQL I/O 行为的用户,建议将 PostgreSQL 统计收集器与能够深入查看内核 I/O 处理情况的操作系统工具结合使用。

28.2.3. pg_stat_activity #

pg_stat_activity 视图每个服务器进程将有一行,显示与该进程当前活动相关的信息。

表 28.3. pg_stat_activity 视图

列类型

描述

datid oid

这个后端连接到的数据库的 OID

datname name

这个后端连接到的数据库的名称

pid integer

这个后端的进程 ID

leader_pid integer

如果此进程是并行查询工作进程,则为并行组领导者的进程 ID。如果此进程是并行组领导者或者不参与并行查询,则为 NULL。

usesysid oid

登录到这个后端的用户的 OID

usename name

登录到此后端的用户名称

application_name text

连接到此后端的应用名称

client_addr inet

连接到这个后端的客户端的 IP 地址。如果这个字段为空值,它表示客户端通过服务器机器上的一个 Unix 套接字连接或者这是一个内部进程,如自动清理。

client_hostname text

已连接的客户端的主机名,由 client_addr 的反向 DNS 查找报告。这个字段将只对 IP 连接非空,并且只有 log_hostname 被启用时才会非空。

client_port integer

客户端用于与此后端通信的 TCP 端口号,如果使用 Unix 套接字,则为 -1。如果该字段为空值,它表示这是一个内部服务器进程。

backend_start timestamp with time zone

这个进程被启动的时间。对客户端后端来说,这就是客户端连接到服务器的时间。

xact_start timestamp with time zone

这个进程的当前事务被启动的时间,如果没有活动事务则为空值。如果当前查询是其事务中的第一个查询,这一列等于 query_start 列。

query_start timestamp with time zone

当前活动查询开始的时间;如果 state 不是 active,则为上一个查询的开始时间

state_change timestamp with time zone

state 上一次发生改变的时间

wait_event_type text

后端正在等待的事件类型(如果有);否则为空值。请参阅表 28.4。

wait_event text

如果此后端当前正在等待,则返回等待事件名称,否则为空值。请参阅表 28.5 到表 28.13。

state text

该后端当前的总体状态。可能的值为:

  • active:后端正在执行一个查询。

  • idle:后端正在等待新的客户端命令。

  • idle in transaction:后端处于事务中,但当前没有执行查询。

  • idle in transaction (aborted):该状态与 idle in transaction 类似,但事务中的某个语句导致了错误。

  • fastpath function call:后端正在执行一个快速路径函数。

  • disabled:如果在此后端中禁用了 track_activities,就会报告此状态。

backend_xid xid

这个后端的顶层事务 ID,如果存在。

backend_xmin xid

当前后端的 xmin 视界。

query_id bigint

这个后端的最近查询的标识符。如果 state 是 active,这个字段显示当前正在执行的查询的标识符。在所有其他状态,它显示执行的最后一个查询的标识符。默认不计算查询标识符,因此该字段将为空值,除非启用 compute_query_id 参数或配置了计算查询标识符的第三方模块。

query text

这个后端最近查询的文本。如果 state 为 active,这个字段显示当前正在执行的查询。在所有其他状态下,它显示上一个被执行的查询。默认情况下,查询文本会被截断至 1024 个字节,这个值可以通过参数 track_activity_query_size 更改。

backend_type text

当前后端的类型。可能的类型为 autovacuum launcher、autovacuum worker、logical replication launcher、logical replication worker、parallel worker、background writer、client backend、checkpointer、archiver、startup、walreceiver、walsender 和 walwriter。此外,由扩展注册的后台工作进程还可能有额外的类型。


注意

wait_event 和 state 列彼此独立。如果某个后端处于 active 状态,它可能在等待(waiting)某个事件,也可能没有等待。如果状态为 active 且 wait_event 非空,就意味着某个查询正在执行,但在系统中的某处被阻塞了。

表 28.4. 等待事件类型

等待事件类型描述
Activity服务器进程空闲。此事件类型表示在其主处理循环中等待活动的进程。wait_event 将标识具体的等待点;参见表 28.5。
BufferPin服务器进程正在等待独占访问一个数据缓冲区。如果另一个进程持有尚未关闭的游标,且该游标最近读取的数据来自此缓冲区,缓冲区钉住等待就可能持续较长时间。参见表 28.6。
Client服务器进程正在等待连接到用户应用程序的套接字上的活动。因此,服务器预计发生一些独立于其内部进程的事情。wait_event 将识别特定的等待点;参见表 28.7。
Extension服务器进程正在等待扩展模块定义的某个条件。参见表 28.8。
IO服务器进程正在等待一个 I/O 操作完成。wait_event 将识别特定的等待点;参见表 28.9。
IPC服务器进程正在等待与另一个服务器进程进行交互。wait_event 将标识具体的等待点;参见表 28.10。
Lock服务器进程正在等待一个重量级锁。重量级锁,也称为锁管理器锁或简称为锁,主要保护表等 SQL 可见对象。然而,它们也用于确保某些内部操作的互斥,例如关系扩展。wait_event 将识别等待的锁的类型;参见表 28.11。
LWLock服务器进程正在等待一个轻量级锁。大多数这样的锁保护共享内存中的某个特定数据结构。wait_event 将包含标识该轻量级锁用途的名称。(有些锁具有专门的名称,另一些锁属于一组用途相似的锁。)参见表 28.12。
Timeout服务器进程正在等待超时过期。wait_event 将识别特定的等待点;参见表 28.13。

表 28.5. Activity 类型的等待事件

Activity 等待事件描述
ArchiverMain在归档进程的主循环中等待。
AutoVacuumMain在自动清理启动进程的主循环中等待。
BgWriterHibernate在后台写入器进程中休眠等待。
BgWriterMain在后台写入器主循环中等待。
CheckpointerMain在检查点进程的主循环中等待。
LogicalApplyMain在逻辑复制应用进程的主循环中等待。
LogicalLauncherMain在逻辑复制启动器进程的主循环中等待。
PgStatMain在统计收集器进程的主循环中等待。
RecoveryWalStream在流恢复期间,在启动进程的主循环中等待 WAL 到达。
SysLoggerMain在 syslogger 进程的主循环中等待。
WalReceiverMain在 WAL 接收进程的主循环中等待。
WalSenderMain在 WAL 发送进程的主循环中等待。
WalWriterMain在 WAL 写入进程的主循环中等待。

表 28.6. BufferPin 类型的等待事件

BufferPin 等待事件描述
BufferPin等待获得缓冲区上的独占钉住。

表 28.7. Client 类型的等待事件

Client 等待事件描述
ClientRead等待从客户端读取数据。
ClientWrite等待写入数据到客户端。
GSSOpenServer在建立 GSSAPI 会话时等待从客户端读取数据。
LibPQWalReceiverConnect在 WAL 接收进程中等待与远程服务器建立连接。
LibPQWalReceiverReceive在 WAL 接收进程中等待从远程服务器接收数据。
SSLOpenServer在尝试连接时等待 SSL。
WalSenderWaitForWAL在 WAL 发送进程中等待 WAL 刷盘。
WalSenderWriteData在 WAL 发送进程中处理 WAL 接收进程的回复时,等待任何活动。

表 28.8. Extension 类型的等待事件

Extension 等待事件描述
Extension在扩展中等待。

表 28.9. IO 类型的等待事件

IO 等待事件描述
BaseBackupRead等待基础备份从文件中读取。
BufFileRead等待从缓冲文件中读取。
BufFileWrite等待对缓冲文件的写入。
BufFileTruncate等待一个缓冲文件被截断。
ControlFileRead等待读取 pg_control 文件。
ControlFileSync等待 pg_control 文件同步到持久存储。
ControlFileSyncUpdate等待对 pg_control 文件的更新同步到持久存储。
ControlFileWrite等待写入 pg_control 文件。
ControlFileWriteUpdate等待写入以更新 pg_control 文件。
CopyFileRead在文件复制操作期间等待读取。
CopyFileWrite在文件复制操作期间等待写入。
DSMFillZeroWrite等待用零填充动态共享内存的后备文件。
DataFileExtend等待关系数据文件被扩展。
DataFileFlush等待关系数据文件同步到持久存储。
DataFileImmediateSync等待关系数据文件立即同步到持久存储。
DataFilePrefetch等待关系数据文件的异步预取。
DataFileRead等待对关系数据文件的读取。
DataFileSync等待对关系数据文件的更改同步到持久存储。
DataFileTruncate等待关系数据文件被截断。
DataFileWrite等待对关系数据文件的写入。
LockFileAddToDataDirRead在向数据目录锁文件中添加一行时等待读取。
LockFileAddToDataDirSync在向数据目录锁文件中添加一行时,等待数据同步到持久存储。
LockFileAddToDataDirWrite在向数据目录锁文件中添加一行时等待写操作。
LockFileCreateRead创建数据目录锁文件时等待读取。
LockFileCreateSync在创建数据目录锁文件时,等待数据同步到持久存储。
LockFileCreateWrite在创建数据目录锁文件时等待写操作。
LockFileReCheckDataDirRead在重新检查数据目录锁文件期间等待读取。
LogicalRewriteCheckpointSync在检查点期间等待逻辑重写映射同步到持久存储。
LogicalRewriteMappingSync在逻辑重写期间等待映射数据同步到持久存储。
LogicalRewriteMappingWrite在逻辑重写期间等待映射数据的写入。
LogicalRewriteSync等待逻辑重写映射同步到持久存储。
LogicalRewriteTruncate在逻辑重写期间等待截断映射数据。
LogicalRewriteWrite等待逻辑重写映射的写入。
RelationMapRead等待关系映射文件的读取。
RelationMapSync等待关系映射文件同步到持久存储。
RelationMapWrite等待对关系映射文件的写入。
ReorderBufferRead在重排序缓冲区管理期间等待读取。
ReorderBufferWrite在重排序缓冲区管理期间等待写入。
ReorderLogicalMappingRead在重排序缓冲区管理期间等待读取逻辑映射。
ReplicationSlotRead等待从复制槽控制文件读取。
ReplicationSlotRestoreSync在将复制槽控制文件恢复到内存期间,等待该文件同步到持久存储。
ReplicationSlotSync等待复制槽控制文件同步到持久存储。
ReplicationSlotWrite等待对复制槽控制文件的写入。
SLRUFlushSync在检查点或数据库关闭期间,等待 SLRU 数据同步到持久存储。
SLRURead等待读取 SLRU 页面。
SLRUSync在页面写入后等待 SLRU 数据同步到持久存储。
SLRUWrite等待 SLRU 页面的写入。
SnapbuildRead等待读取序列化的历史系统目录快照。
SnapbuildSync等待序列化的历史系统目录快照同步到持久存储。
SnapbuildWrite等待写入序列化的历史系统目录快照。
TimelineHistoryFileSync等待通过流复制接收的时间线历史文件同步到持久存储。
TimelineHistoryFileWrite等待通过流复制接收的时间线历史文件的写入。
TimelineHistoryRead等待读取时间线历史文件。
TimelineHistorySync等待新创建的时间线历史文件同步到持久存储。
TimelineHistoryWrite等待写入新创建的时间线历史文件。
TwophaseFileRead等待读取两阶段状态文件。
TwophaseFileSync等待两阶段状态文件同步到持久存储。
TwophaseFileWrite等待对两阶段状态文件的写入。
WALBootstrapSync在引导过程中等待 WAL 同步到持久存储。
WALBootstrapWrite在引导过程中等待 WAL 页面的写入。
WALCopyRead通过复制一个已有 WAL 段来创建一个新的 WAL 段时等待读取。
WALCopySync等待通过复制现有 WAL 段创建的新 WAL 段同步到持久存储。
WALCopyWrite通过复制一个已有 WAL 段来创建一个新的 WAL 段时等待写入。
WALInitSync等待新初始化的 WAL 文件同步到持久存储。
WALInitWrite在初始化一个新的 WAL 文件时等待写入。
WALRead等待 WAL 文件的读取。
WALSenderTimelineHistoryRead在 WAL 发送进程执行时间线命令期间,等待从时间线历史文件读取。
WALSync等待 WAL 文件同步到持久存储。
WALSyncMethodAssign在设置新的 WAL 同步方法时,等待数据同步到持久存储。
WALWrite等待写入 WAL 文件。
LogicalChangesRead等待从逻辑变更文件读取。
LogicalChangesWrite等待写入逻辑变更文件。
LogicalSubxactRead等待从逻辑子事务文件读取。
LogicalSubxactWrite等待写入逻辑子事务文件。

表 28.10. IPC 类型的等待事件

IPC 等待事件描述
AppendReady等待 Append 计划节点的子计划节点准备好。
BackendTermination等待另一个后端终止。
BackupWaitWalArchive等待备份所需的 WAL 文件成功归档。
BgWorkerShutdown等待后台工作进程关闭。
BgWorkerStartup等待后台工作进程启动。
BtreePage等待继续并行 B-树扫描所需的页号变得可用。
BufferIO等待缓冲区 I/O 完成。
CheckpointDone等待检查点完成。
CheckpointStart等待检查点开始。
ExecuteGather在执行 Gather 计划节点时,等待子进程的活动。
HashBatchAllocate等待选出的 Parallel Hash 参与者分配 hash 表。
HashBatchElect等待选出负责分配 hash 表的 Parallel Hash 参与者。
HashBatchLoad等待其他 Parallel Hash 参与者完成 hash 表的加载。
HashBuildAllocate等待选出的 Parallel Hash 参与者分配初始 hash 表。
HashBuildElect等待选出负责分配初始 hash 表的 Parallel Hash 参与者。
HashBuildHashInner等待其他 Parallel Hash 参与者完成对内层关系的 hash 处理。
HashBuildHashOuter等待其他 Parallel Hash 参与者完成对外层关系的分区。
HashGrowBatchesAllocate等待选出的 Parallel Hash 参与者分配更多批次。
HashGrowBatchesDecide等待选出负责决定后续批次增长的 Parallel Hash 参与者。
HashGrowBatchesElect等待选出负责分配更多批次的 Parallel Hash 参与者。
HashGrowBatchesFinish等待选出的 Parallel Hash 参与者决定后续的批次增长。
HashGrowBatchesRepartition等待其他 Parallel Hash 参与者完成重新分区。
HashGrowBucketsAllocate等待选出的 Parallel Hash 参与者完成更多桶的分配。
HashGrowBucketsElect等待选出负责分配更多桶的 Parallel Hash 参与者。
HashGrowBucketsReinsert等待其他 Parallel Hash 参与者完成向新桶插入元组。
LogicalSyncData等待逻辑复制远程服务器发送用于初始表同步的数据。
LogicalSyncStateChange等待逻辑复制远程服务器更改状态。
MessageQueueInternal等待另一个进程附加到共享消息队列。
MessageQueuePutMessage等待将协议消息写入共享消息队列。
MessageQueueReceive等待从共享消息队列接收字节。
MessageQueueSend等待将字节发送到共享消息队列。
ParallelBitmapScan等待并行位图扫描完成初始化。
ParallelCreateIndexScan等待并行 CREATE INDEX 工作进程完成堆扫描。
ParallelFinish等待并行工作进程完成计算。
ProcArrayGroupUpdate等待组领导者在事务结束时清除事务 ID。
ProcSignalBarrier等待屏障事件被所有后端处理。
Promote等待备库提升。
RecoveryConflictSnapshot等待解决清理操作引发的恢复冲突。
RecoveryConflictTablespace等待解决删除表空间引发的恢复冲突。
RecoveryPause等待恢复继续进行。
ReplicationOriginDrop等待复制源变为非活动状态,以便可以删除它。
ReplicationSlotDrop等待复制槽变为非活动状态,以便可以删除它。
SafeSnapshot等待获取 READ ONLY DEFERRABLE 事务的有效快照。
SyncRep在同步复制期间等待来自远程服务器的确认。
WalReceiverExit等待 WAL 接收进程退出。
WalReceiverWaitStart等待启动进程为流复制发送初始数据。
XactGroupUpdate等待组领导者在事务结束时更新事务状态。

表 28.11. Lock 类型的等待事件

Lock 等待事件描述
advisory等待获取用户咨询锁。
extend等待扩展一个关系。
frozenid等待更新 pg_database.datfrozenxid 和 pg_database.datminmxid。
object等待获取非关系数据库对象上的锁。
page等待获取一个关系页面上的锁。
relation等待获取关系上的锁。
spectoken等待获取推测插入锁。
transactionid等待事务完成。
tuple等待获取元组上的锁。
userlock等待获取用户锁。
virtualxid等待获取虚拟事务 ID 锁。

表 28.12. LWLock 类型的等待事件

LWLock 等待事件描述
AddinShmemInit等待管理扩展在共享内存中的空间分配。
AutoFile等待更新 postgresql.auto.conf 文件。
Autovacuum等待读取或更新自动清理工作进程的当前状态。
AutovacuumSchedule等待确认选中进行自动清理的表是否仍需清理。
BackgroundWorker等待读取或更新后台工作进程状态。
BtreeVacuum等待读取或更新 B-树索引的清理相关信息。
BufferContent等待访问内存中的数据页。
BufferMapping等待将数据块与缓冲池中的缓冲区关联。
CheckpointerComm等待管理 fsync 请求。
CommitTs等待读取或更新最近设置的事务提交时间戳值。
CommitTsBuffer在提交时间戳 SLRU 缓冲区上等待 I/O。
CommitTsSLRU等待访问提交时间戳 SLRU 缓存。
ControlFile等待读取或更新 pg_control 文件或创建一个新的 WAL 文件。
DynamicSharedMemoryControl等待读取或更新动态共享内存分配信息。
LockFastPath等待读取或更新进程的快速路径锁信息。
LockManager等待读取或更新有关“重量级”锁的信息。
LogicalRepWorker等待读取或更新逻辑复制工作进程的状态。
MultiXactGen等待读取或更新共享的多事务状态。
MultiXactMemberBuffer等待多事务成员 SLRU 缓冲区上的 I/O。
MultiXactMemberSLRU等待访问多事务成员 SLRU 缓存。
MultiXactOffsetBuffer等待多事务偏移量 SLRU 缓冲区上的 I/O。
MultiXactOffsetSLRU等待访问多事务偏移量 SLRU 缓存。
MultiXactTruncation等待读取或截断多事务信息。
NotifyBuffer在 NOTIFY 消息 SLRU 缓冲区上等待 I/O。
NotifyQueue等待读取或更新 NOTIFY 消息。
NotifyQueueTail等待更新 NOTIFY 消息存储的限制。
NotifySLRU等待访问 NOTIFY 消息 SLRU 缓存。
OidGen等待分配一个新的 OID。
OldSnapshotTimeMap等待读取或更新旧的快照控制信息。
ParallelAppend在 Parallel Append 计划执行期间等待选择下一个子计划。
ParallelHashJoin在 Parallel Hash Join 计划执行期间等待同步工作进程。
ParallelQueryDSA等待并行查询动态共享内存分配。
PerSessionDSA等待并行查询动态共享内存分配。
PerSessionRecordType等待访问并行查询中有关复合类型的信息。
PerSessionRecordTypmod等待访问并行查询中用于标识匿名记录类型的类型修饰符信息。
PerXactPredicateList在并行查询期间等待访问当前可串行化事务持有的谓词锁列表。
PredicateLockManager等待访问可串行化事务使用的谓词锁信息。
ProcArray等待访问各进程的共享数据结构(通常是为了获取快照或报告会话的事务 ID)。
RelationMapping等待读取或更新 pg_filenode.map 文件(用于跟踪某些系统目录的文件节点分配)。
RelCacheInit等待读取或更新 pg_internal.init 关系缓存初始化文件。
ReplicationOrigin等待创建、删除或使用复制源。
ReplicationOriginState等待读取或更新一个复制源的进度。
ReplicationSlotAllocation等待分配或释放复制槽。
ReplicationSlotControl等待读取或更新复制槽状态。
ReplicationSlotIO在复制槽上等待 I/O。
SerialBuffer在可串行化事务冲突的 SLRU 缓冲区上等待 I/O。
SerializableFinishedList等待访问已完成的可串行化事务列表。
SerializablePredicateList等待访问可串行化事务持有的谓词锁列表。
SerializableXactHash等待读取或更新关于可串行化事务的信息。
SerialSLRU等待访问可串行化事务冲突 SLRU 缓存。
SharedTidBitmap在并行位图索引扫描期间等待访问共享的 TID 位图。
SharedTupleStore在并行查询期间等待访问共享元组存储。
ShmemIndex等待在共享内存中找到或分配空间。
SInvalRead等待从共享系统目录失效队列中取出消息。
SInvalWrite等待向共享系统目录失效队列添加消息。
SubtransBuffer在子事务 SLRU 缓冲区上等待 I/O。
SubtransSLRU等待访问子事务 SLRU 缓存。
SyncRep等待读取或更新有关同步复制状态的信息。
SyncScan等待选择同步表扫描的起始位置。
TablespaceCreate等待创建或删除表空间。
TwoPhaseState等待读取或更新预备事务的状态。
WALBufMapping等待在 WAL 缓冲区中替换一个页面。
WALInsert等待将 WAL 数据插入内存缓冲区。
WALWrite等待 WAL 缓冲区写入磁盘。
WrapLimitsVacuum等待更新事务 ID 和多事务消耗量的限制。
XactBuffer在事务状态的 SLRU 缓冲区上等待 I/O。
XactSLRU等待访问事务状态的 SLRU 缓存。
XactTruncation等待执行 pg_xact_status 或更新它可用的最早的事务 ID。
XidGen等待分配新的事务 ID。

注意

扩展可以将 LWLock 类型添加到表 28.12 所示的列表中。在某些情况下,扩展分配的名称无法在所有服务器进程中使用;因此,LWLock 等待事件可能只会被报告为“extension”,而不是扩展分配的名称。

表 28.13.  Timeout 类型的等待事件

Timeout 等待事件描述
BaseBackupThrottle在基础备份期间因限流而等待。
CheckpointWriteDelay在执行检查点时,在各次写入之间等待。
PgSleep由于调用 pg_sleep 或同类函数而等待。
RecoveryApplyDelay由于延迟设置,在恢复期间等待应用 WAL。
RecoveryRetrieveRetryInterval当 WAL 数据无法从任何来源(pg_wal、归档或流复制)获得时,在恢复期间等待。
RegisterSyncRequest向检查点进程发送同步请求时,因请求队列已满而等待。
VacuumDelay在基于代价的清理延迟点等待。

以下示例展示如何查看等待事件:

SELECT pid, wait_event_type, wait_event FROM pg_stat_activity WHERE wait_event is NOT NULL;
 pid  | wait_event_type | wait_event
------+-----------------+------------
 2540 | Lock            | relation
 6644 | LWLock          | ProcArray
(2 rows)

28.2.4. pg_stat_replication #

pg_stat_replication 视图为每个 WAL 发送进程包含一行,显示有关复制到该发送进程所连接备库的统计信息。这里只列出直接连接的备库;不包含下游备库的信息。

表 28.14. pg_stat_replication 视图

列类型

描述

pid integer

一个 WAL 发送进程的进程 ID

usesysid oid

登录到这个 WAL 发送进程的用户的 OID

usename name

登录到这个 WAL 发送进程的用户的名称

application_name text

连接到这个 WAL 发送进程的应用的名称

client_addr inet

连接到这个 WAL 发送进程的客户端的 IP 地址。如果这个字段为空值,它表示该客户端通过服务器机器上的一个 Unix 套接字连接。

client_hostname text

已连接的客户端的主机名,由 client_addr 的反向 DNS 查找报告。这个字段将只对 IP 连接非空,并且只有 log_hostname 被启用时才会非空。

client_port integer

客户端用来与这个 WAL 发送进程通讯的 TCP 端口号,如果使用 Unix 套接字则为 -1

backend_start timestamp with time zone

这个进程开始的时间,即客户端是何时连接到这个 WAL 发送进程的。

backend_xmin xid

由 hot_standby_feedback 报告的该备库的 xmin 视界。

state text

当前的 WAL 发送进程状态。可能的值是:

  • startup:此 WAL 发送进程正在启动。

  • catchup:与此 WAL 发送进程连接的备库正在赶上主库。

  • streaming:在其连接的备库赶上主库之后,此 WAL 发送进程正在流式传输更改。

  • backup:此 WAL 发送进程正在发送一个备份。

  • stopping:此 WAL 发送进程正在停止。

sent_lsn pg_lsn

在这个连接上发送的最后一个预写式日志的位置

write_lsn pg_lsn

该备库已写入磁盘的最后一个预写式日志位置

flush_lsn pg_lsn

该备库已刷入磁盘的最后一个预写式日志位置

replay_lsn pg_lsn

已在该备库数据库中重放的最后一个预写式日志位置

write_lag interval

从在本地将最近的 WAL 刷盘,到收到该备库已写入该 WAL(但尚未刷盘或应用)的通知之间经过的时间。如果该服务器被配置为同步备库,可用此值衡量在提交时 synchronous_commit 级别 remote_write 所导致的延迟。

flush_lag interval

从在本地将最近的 WAL 刷盘,到收到该备库已写入该 WAL 并将其刷盘(但尚未应用)的通知之间经过的时间。如果该服务器被配置为同步备库,可用此值衡量在提交时 synchronous_commit 级别 on 所导致的延迟。

replay_lag interval

从在本地将最近的 WAL 刷盘,到收到该备库已写入该 WAL、将其刷盘并应用的通知之间经过的时间。如果该服务器被配置为同步备库,可用此值衡量在提交时 synchronous_commit 级别 remote_apply 所导致的延迟。

sync_priority integer

在基于优先级的同步复制中,该备库被选为同步备库的优先级。在基于法定人数的同步复制中,此值不起作用。

sync_state text

该备库的同步状态。可能的值是:

  • async:该备库是异步的。

  • potential:该备库当前是异步的,但在当前某个同步备库失效时可能变为同步的。

  • sync:该备库是同步的。

  • quorum:该备库被视为法定人数同步复制的候选备库。

reply_time timestamp with time zone

从备库收到的最后一条回复消息的发送时间


pg_stat_replication 视图中报告的滞后时间,是最近的 WAL 被写入、刷盘和重放,以及发送端获知这些操作完成所花费时间的度量。如果远程服务器被配置为同步备库,这些时间表示各个同步提交级别带来或可能带来的提交延迟。对于异步备库,replay_lag 列是最近事务对查询变得可见所需延迟时间的近似值。如果备库已经完全追上发送服务器且没有新的 WAL 活动,系统会在短时间内继续显示最近测得的滞后时间,随后显示为空值。

对于物理复制,滞后时间会自动测量。逻辑解码插件可以选择发出跟踪消息;如果没有这样做,跟踪机制会将滞后显示为空值。

注意

报告出的滞后时间并不是根据当前重放速率预测该备库还需多久才能追上发送服务器。在持续生成新 WAL 时,那样的系统可能会显示相近的时间;但当发送端空闲时,就会显示不同的值。特别是当备库已经完全追上时,pg_stat_replication 显示的是写入、刷盘和重放最近报告的 WAL 位置所花费的时间,而不是某些用户可能预期的零。这样做符合为最近写事务测量同步提交和事务可见性延迟的目的。为减少用户因预期另一种滞后模型而产生的混淆,在一个已完全重放且处于空闲状态的系统上,滞后列会在较短时间后恢复为空值。监控系统应自行决定将这种情况表示为缺失数据、零,还是继续显示最近一次已知值。

28.2.5. pg_stat_replication_slots #

pg_stat_replication_slots 视图将包含每个逻辑复制槽的一行,显示关于其使用情况的统计信息。

表 28.15. pg_stat_replication_slots 视图

列类型

描述

slot_name text

复制槽在整个集簇范围内的唯一标识符

spill_txns bigint

当逻辑解码从 WAL 解码更改时所使用的内存超过 logical_decoding_work_mem 后,溢出到磁盘的事务数。顶层事务和子事务都会使此计数器递增。

spill_count bigint

在为该槽解码来自 WAL 的更改时,事务溢出到磁盘的次数。此计数器在每次事务溢出时递增,并且同一事务可能溢出多次。

spill_bytes bigint

为此槽从 WAL 解码更改时,溢出到磁盘的已解码事务数据量。此计数器及其他溢出计数器可用于衡量逻辑解码期间发生的 I/O,并用于调优 logical_decoding_work_mem。

stream_txns bigint

当逻辑解码为此槽从 WAL 解码更改时所使用的内存超过 logical_decoding_work_mem 后,流式传输到解码输出插件的进行中事务数。流式传输仅适用于顶层事务(子事务不能单独进行流式传输),因此子事务不会使此计数器递增。

stream_countbigint

在为该槽解码来自 WAL 的更改时,将进行中事务流式传输到解码输出插件的次数。此计数器在每次事务流式传输时递增,并且同一事务可能被流式传输多次。

stream_bytesbigint

在为该槽解码来自 WAL 的更改时,为将进行中事务流式传输到解码输出插件而解码的事务数据量。这个和针对此槽的其他流式传输计数器可用于调优 logical_decoding_work_mem。

total_txns bigint

针对此槽发送到解码输出插件的已解码事务数。这只统计顶层事务,不会因子事务而增加计数。注意,这包括流式传输和/或溢出的事务。

total_bytesbigint

在为此槽从 WAL 解码更改时,为将事务发送到解码输出插件而解码的事务数据量。注意这包括流式传输和/或溢出的数据。

stats_reset timestamp with time zone

这些统计信息上次被重置的时间


28.2.6. pg_stat_wal_receiver #

pg_stat_wal_receiver 视图只包含一行,显示 WAL 接收进程从其所连接服务器接收数据的统计信息。

表 28.16. pg_stat_wal_receiver 视图

列类型

描述

pid integer

WAL 接收进程的进程 ID

status text

WAL 接收进程的活动状态

receive_start_lsn pg_lsn

WAL 接收进程启动时使用的第一个预写式日志位置

receive_start_tli integer

WAL 接收进程启动时使用的第一个时间线编号

written_lsn pg_lsn

已经接收并写入磁盘的最后一个预写式日志位置,但尚未刷盘。此字段不应用于数据完整性检查。

flushed_lsn pg_lsn

已经接收并刷入到磁盘的最后一个预写式日志位置,该字段的初始值是启动 WAL 接收进程时使用的第一个日志位置

received_tli integer

接收并刷入到磁盘的最后一个预写式日志位置的时间线编号,该字段的初始值为启动 WAL 接收进程时使用的第一个日志位置的时间线编号

last_msg_send_time timestamp with time zone

从源 WAL 发送进程收到的最后一条消息的发送时间

last_msg_receipt_time timestamp with time zone

从源 WAL 发送进程收到的最后一条消息的接收时间

latest_end_lsn pg_lsn

向源 WAL 发送进程报告的最后一个预写式日志位置

latest_end_time timestamp with time zone

向源 WAL 发送进程报告最后一个预写式日志位置的时间

slot_name text

这个 WAL 接收进程使用的复制槽的名称

sender_host text

这个 WAL 接收进程连接到的 PostgreSQL 实例的主机。这可以是主机名或 IP 地址;如果通过 Unix 套接字连接,也可以是目录路径。(路径的情况可以区分,因为它总是以/开头的绝对路径。)

sender_port integer

这个 WAL 接收进程连接的 PostgreSQL 实例的端口号。

conninfo text

这个 WAL 接收进程使用的连接字符串,对安全敏感的字段进行了模糊处理。


28.2.7. pg_stat_subscription #

pg_stat_subscription 视图为每个订阅的主工作进程包含一行(如果该工作进程未运行,则 PID 为空),并为处理订阅表初始数据复制的工作进程包含额外的行。

表 28.17. pg_stat_subscription 视图

列类型

描述

subid oid

订阅的 OID

subname name

订阅的名称

pid integer

订阅工作进程的进程 ID

relid oid

该工作进程正在同步的关系的 OID;主应用工作进程则为 null

received_lsn pg_lsn

接收到的最后一个预写式日志位置,该字段的初始值为 0

last_msg_send_time timestamp with time zone

从源 WAL 发送进程收到的最后一条消息的发送时间

last_msg_receipt_time timestamp with time zone

从源 WAL 发送进程收到的最后一条消息的接收时间

latest_end_lsn pg_lsn

向源 WAL 发送进程报告的最后一个预写式日志位置

latest_end_time timestamp with time zone

向源 WAL 发送进程报告最后一个预写式日志位置的时间


28.2.8. pg_stat_ssl #

pg_stat_ssl 视图将为每一个后端或者 WAL 发送进程包含一行,用来显示这个连接上的 SSL 使用情况。可以把它与 pg_stat_activity 或者 pg_stat_replication 通过 pid 列连接来得到更多有关该连接的细节。

表 28.18. pg_stat_ssl 视图

列类型

描述

pid integer

后端或 WAL 发送进程的进程 ID

ssl boolean

如果在此连接上使用 SSL,则为真

version text

使用 SSL 的版本,如果此连接上没有使用 SSL 则为空值

cipher text

正在使用的 SSL 密码套件的名称,如果此连接上没有使用 SSL 则为空值

bits integer

使用的加密算法中的位数,如果此连接上没有使用 SSL 则为空值

client_dn text

所用客户端证书中的区别名称(DN,Distinguished Name)字段,如果没有提供客户端证书或在此连接上没有使用 SSL,则为空值。如果 DN 字段长于 NAMEDATALEN(标准构建中为 64 个字符),则该字段将被截断。

client_serial numeric

客户端证书的序列号,如果没有提供客户端证书或在此连接上没有使用 SSL,则为空值。证书序列号和证书颁发者的组合唯一标识一个证书(除非颁发者错误地重用序列号)。

issuer_dn text

客户端证书颁发者的区别名称(DN,Distinguished Name),如果没有提供客户端证书或在此连接上没有使用 SSL,则为空值。该字段像 client_dn 一样被截断。


28.2.9. pg_stat_gssapi #

pg_stat_gssapi 视图为每个后端包含一行,显示该连接上的 GSSAPI 使用情况。可以通过 pid 列将它与 pg_stat_activity 或 pg_stat_replication 连接,获取更多关于连接的详细信息。

表 28.19. pg_stat_gssapi 视图

列类型

描述

pid integer

后端进程 ID

gss_authenticated boolean

如果此连接使用了 GSSAPI 认证,则为真

principal text

用于认证此连接的主体,如果未使用 GSSAPI 对此连接进行认证,则为空值。如果主体长度超过 NAMEDATALEN(标准构建中为 64 个字符),则该字段被截断。

encrypted boolean

如果在此连接上使用了 GSSAPI 加密,则为真


28.2.10. pg_stat_archiver #

pg_stat_archiver 视图总是有一行,其中包含关于集簇的归档进程的数据。

表 28.20. pg_stat_archiver 视图

列类型

描述

archived_count bigint

已成功归档的 WAL 文件数

last_archived_wal text

最近成功归档的 WAL 文件的名称

last_archived_time timestamp with time zone

最近成功归档操作的时间

failed_count bigint

记录 WAL 文件归档失败次数

last_failed_wal text

最近一次归档操作失败的 WAL 文件的名称

last_failed_time timestamp with time zone

最近一次归档操作失败的时间

stats_reset timestamp with time zone

这些统计信息上次被重置的时间


28.2.11. pg_stat_bgwriter #

pg_stat_bgwriter 视图始终只有一行,包含整个集簇的全局数据。

表 28.21. pg_stat_bgwriter 视图

列类型

描述

checkpoints_timed bigint

已执行的计划检查点数

checkpoints_req bigint

已执行的请求检查点数

checkpoint_write_time double precision

检查点处理中将文件写入磁盘部分所花费的总时间,单位为毫秒

checkpoint_sync_time double precision

检查点处理中将文件同步到磁盘部分所花费的总时间,单位为毫秒

buffers_checkpoint bigint

检查点期间写入的缓冲区数

buffers_clean bigint

后台写入器写入的缓冲区数量

maxwritten_clean bigint

后台写入器因写入了过多缓冲区而停止清理扫描的次数

buffers_backend bigint

后端直接写入的缓冲区数

buffers_backend_fsync bigint

后端必须自行执行 fsync 调用的次数(通常即使后端自行写入,也由后台写入器处理这些调用)

buffers_alloc bigint

分配的缓冲区数量

stats_reset timestamp with time zone

这些统计信息上次被重置的时间


28.2.12. pg_stat_wal #

pg_stat_wal 视图一直有一行,包含关于集簇的 WAL 活动的数据。

表 28.22. pg_stat_wal 视图

列类型

描述

wal_records bigint

生成的 WAL 记录的总数

wal_fpi bigint

生成的 WAL 整页镜像的总数

wal_bytes numeric

生成的 WAL 总量,以字节计

wal_buffers_full bigint

因为 WAL 缓冲区已满,WAL 数据被写入磁盘的次数

wal_write bigint

通过 XLogWrite 请求,WAL 缓冲区被写入到磁盘的次数。有关内部 WAL 函数 XLogWrite 的更多信息,请参见第 30.5 节。

wal_sync bigint

通过 issue_xlog_fsync 请求将 WAL 文件同步到磁盘的次数(如果 fsync 是 on 且 wal_sync_method 是 fdatasync、fsync 或 fsync_writethrough,否则为零)。有关内部 WAL 函数 issue_xlog_fsync 的更多信息,参见第 30.5 节。

wal_write_time double precision

通过 XLogWrite 请求将 WAL 缓冲区写入磁盘所消耗的总时间,以毫秒计(如果 track_wal_io_timing 是启用的,否则为零)。这包括当 wal_sync_method 为 open_datasync 或 open_sync 时的同步时间。

wal_sync_time double precision

通过 issue_xlog_fsync 请求将 WAL 文件同步到磁盘所花费的总时间,以毫秒计(如果启用了 track_wal_io_timing、fsync 为 on,且 wal_sync_method 为 fdatasync、fsync 或 fsync_writethrough,否则为零)。

stats_reset timestamp with time zone

这些统计信息上次被重置的时间


28.2.13. pg_stat_database #

pg_stat_database 视图将包含一行用于集簇中的每个数据库,加一行用于共享对象,显示数据库范围的统计信息。

表 28.23. pg_stat_database 视图

列类型

描述

datid oid

该数据库的 OID,属于共享关系的对象为 0

datname name

这个数据库的名称,或者共享对象为 NULL。

numbackends integer

当前连接到此数据库的后端数,对于共享对象则为 NULL。这是该视图中唯一返回反映当前状态的值的列;所有其他列返回自上次重置以来累积的值。

xact_commit bigint

此数据库中已提交的事务数

xact_rollback bigint

该数据库中已回滚的事务数

blks_read bigint

在该数据库中读取的磁盘块数

blks_hit bigint

在缓冲区缓存中发现磁盘块、因而无需读取的次数(这里只统计 PostgreSQL 缓冲区缓存中的命中,不包括操作系统文件系统缓存中的命中)

tup_returned bigint

此数据库中的查询返回的行数

tup_fetched bigint

此数据库中的查询获取的行数

tup_inserted bigint

查询在该数据库中插入的行数

tup_updated bigint

这个数据库中查询更新的行数

tup_deleted bigint

这个数据库中被查询删除的行数

conflicts bigint

由于与此数据库中的恢复冲突而被取消的查询数。(冲突只会发生在备库上;请参阅 pg_stat_database_conflicts。)

temp_files bigint

这个数据库中查询创建的临时文件的数量。所有临时文件都将被计数,而不顾及临时文件为什么被创建(例如,排序或 hash 运算),也不考虑 log_temp_files 设置。

temp_bytes bigint

这个数据库中的查询写入临时文件的数据总量。所有临时文件都将被计数,而不考虑临时文件为什么被创建,也不考虑 log_temp_files 设置。

deadlocks bigint

在此数据库中检测到的死锁数

checksum_failures bigint

在此数据库(或共享对象)中检测到的数据页校验和失败次数,如果未启用数据校验和则为 NULL。

checksum_last_failure timestamp with time zone

在此数据库(或共享对象)中最后一次检测到数据页校验和失败的时间,如果未启用数据校验和则为 NULL。

blk_read_time double precision

在这个数据库中通过后端读取数据文件块所花费的时间,以毫秒为单位(如果启用了 track_io_timing,否则为零)

blk_write_time double precision

在这个数据库中通过后端写数据文件块所花费的时间,以毫秒为单位(如果启用了 track_io_timing,否则为零)

session_time double precision

此数据库中数据库会话所消耗的时间,以毫秒计(注意统计信息仅在会话状态发生变化时更新,因此如果会话空闲很长时间,则不包括此空闲时间)

active_time double precision

此数据库中执行 SQL 语句所消耗的时间,以毫秒计(这对应于 pg_stat_activity 中的 active 和 fastpath function call 状态)

idle_in_transaction_time double precision

此数据库中事务空闲所消耗的时间,以毫秒计(这对应于 pg_stat_activity 中的 idle in transaction 和 idle in transaction (aborted) 状态)

sessions bigint

此数据库建立的会话总数

sessions_abandoned bigint

此数据库因为到客户端的连接丢失而被终止的数据库会话数

sessions_fatal bigint

此数据库因为致命错误而被终止的数据库会话数

sessions_killed bigint

此数据库因为操作者介入而被终止的数据库会话数

stats_reset timestamp with time zone

这些统计信息上次被重置的时间


28.2.14. pg_stat_database_conflicts #

pg_stat_database_conflicts 视图为每个数据库包含一行,用来显示数据库范围内因与备库上的恢复过程冲突而被取消的查询统计信息。该视图只包含备库上的信息,因为这类冲突不会发生在主库上。

表 28.24. pg_stat_database_conflicts 视图

列类型

描述

datid oid

数据库的 OID

datname name

数据库的名称

confl_tablespace bigint

这个数据库中由于删除表空间而取消的查询的数量

confl_lock bigint

此数据库中由于锁定超时而被取消的查询数

confl_snapshot bigint

此数据库中由于旧快照而取消的查询数

confl_bufferpin bigint

此数据库中由于缓冲区被钉住而被取消的查询数

confl_deadlock bigint

此数据库中由于死锁而被取消的查询数


28.2.15. pg_stat_all_tables #

pg_stat_all_tables 视图将为当前数据库中的每一个表(包括 TOAST 表)包含一行,该行显示与对该表的访问相关的统计信息。pg_stat_user_tables 和 pg_stat_sys_tables 视图包含相同的信息,但经过过滤,分别只显示用户和系统表。

表 28.25. pg_stat_all_tables 视图

列类型

描述

relid oid

表的 OID

schemaname name

该表所在的模式的名称

relname name

这个表的名称

seq_scan bigint

在此表上启动的顺序扫描数

seq_tup_read bigint

顺序扫描获取的存活行数

idx_scan bigint

对这个表发起的索引扫描数

idx_tup_fetch bigint

索引扫描获取的存活行数

n_tup_ins bigint

插入的行数

n_tup_upd bigint

更新的行数(包括 HOT 更新的行)

n_tup_del bigint

删除的行数

n_tup_hot_upd bigint

HOT 更新的行数(即不需要单独更新索引)

n_live_tup bigint

活的行的估计数量

n_dead_tup bigint

死行的估计数量

n_mod_since_analyze bigint

自上次分析此表以来修改的行的估计数量

n_ins_since_vacuum bigint

自上次清理此表以来插入的行的估计数量

last_vacuum timestamp with time zone

最后一次手动清理这个表的时间(不包括 VACUUM FULL)

last_autovacuum timestamp with time zone

这个表最后一次被自动清理守护进程清理的时间

last_analyze timestamp with time zone

上一次手动分析这个表的时间

last_autoanalyze timestamp with time zone

自动清理守护进程最后一次分析这个表的时间

vacuum_count bigint

这个表被手动清理的次数(VACUUM FULL 不计数)

autovacuum_count bigint

这个表被自动清理守护进程清理的次数

analyze_count bigint

手动分析这个表的次数

autoanalyze_count bigint

这个表被自动清理守护进程分析的次数


28.2.16. pg_stat_all_indexes #

pg_stat_all_indexes 视图将为当前数据库中的每个索引包含一行,该行显示关于对该索引访问的统计信息。pg_stat_user_indexes 和 pg_stat_sys_indexes 视图包含相同的信息,但经过过滤,分别只显示用户和系统索引。

表 28.26. pg_stat_all_indexes 视图

列类型

描述

relid oid

此索引所在表的 OID

indexrelid oid

这个索引的 OID

schemaname name

这个索引所在的模式名称

relname name

这个索引的表的名称

indexrelname name

这个索引的名称

idx_scan bigint

在这个索引上开启的索引扫描的数量

idx_tup_read bigint

扫描此索引返回的索引项数

idx_tup_fetch bigint

使用此索引进行简单索引扫描获取的存活表行数


索引可以被简单索引扫描、“位图”索引扫描以及优化器使用。在一次位图扫描中,多个索引的输出可以通过 AND 或 OR 规则组合,因此当使用一次位图扫描时难以将取得的个体堆行与特定的索引关联起来。因此,一次位图扫描会增加它使用的索引的 pg_stat_all_indexes.idx_tup_read 计数,并且为该表增加 pg_stat_all_tables.idx_tup_fetch 计数,但是它不影响 pg_stat_all_indexes.idx_tup_fetch。如果所提供的常量值不在优化器统计信息记录的范围之内,优化器也会访问索引来检查,因为优化器统计信息可能已经过时。

注意

即使不用位图扫描,idx_tup_read 和 idx_tup_fetch 计数也可能不同,因为 idx_tup_read 统计从该索引取得的索引项而 idx_tup_fetch 统计从表取得的存活行。如果使用该索引取得了任何死亡行或还未提交的行,或者如果通过一次仅索引扫描的方式避免了任何堆获取,后者将较小。

28.2.17. pg_statio_all_tables #

pg_statio_all_tables 视图将为当前数据库中的每个表(包括 TOAST 表)包含一行,该行显示指定表上有关 I/O 的统计信息。pg_statio_user_tables 和 pg_statio_sys_tables 视图包含相同的信息,但经过过滤,分别只显示用户表和系统表。

表 28.27. pg_statio_all_tables 视图

列类型

描述

relid oid

表的 OID

schemaname name

该表所在的模式的名称

relname name

这个表的名称

heap_blks_read bigint

从该表中读取的磁盘块的数量

heap_blks_hit bigint

该表中的缓冲区命中数

idx_blks_read bigint

从这个表上所有索引读取的磁盘块数

idx_blks_hit bigint

这个表上所有索引中的缓冲区命中数

toast_blks_read bigint

从这个表的 TOAST 表中读取的磁盘块的数量(如果有的话)

toast_blks_hit bigint

这个表的 TOAST 表中的缓冲区命中数(如果有的话)

tidx_blks_read bigint

从这个表的 TOAST 表索引中读取的磁盘块的数量(如果有的话)

tidx_blks_hit bigint

这个表的 TOAST 表索引中的缓冲区命中数(如果有的话)


28.2.18. pg_statio_all_indexes #

pg_statio_all_indexes 视图将为当前数据库中的每个索引包含一行,该行显示指定索引上有关 I/O 的统计信息。pg_statio_user_indexes 和 pg_statio_sys_indexes 视图包含相同的信息,但经过过滤,分别只显示用户索引和系统索引。

表 28.28. pg_statio_all_indexes 视图

列类型

描述

relid oid

此索引所在表的 OID

indexrelid oid

这个索引的 OID

schemaname name

这个索引所在的模式名称

relname name

这个索引的表的名称

indexrelname name

这个索引的名称

idx_blks_read bigint

从此索引中读取的磁盘块的数量

idx_blks_hit bigint

此索引中的缓冲区命中数


28.2.19. pg_statio_all_sequences #

pg_statio_all_sequences 视图将为当前数据库中的每个序列包含一行,该行显示在指定序列上有关 I/O 的统计信息。

表 28.29. pg_statio_all_sequences 视图

列类型

描述

relid oid

序列的 OID

schemaname name

此序列所在的模式的名称

relname name

此序列的名称

blks_read bigint

从这个序列中读取的磁盘块的数量

blks_hit bigint

在此序列中的缓冲区命中数


28.2.20. pg_stat_user_functions #

pg_stat_user_functions 视图将为每一个被追踪的函数包含一行,该行显示有关该函数执行的统计信息。track_functions 参数控制到底哪些函数被跟踪。

表 28.30. pg_stat_user_functions 视图

列类型

描述

funcid oid

函数的 OID

schemaname name

这个函数所在的模式的名称

funcname name

这个函数的名称

calls bigint

这个函数已经被调用的次数

total_time double precision

在这个函数以及它所调用的其他函数中花费的总时间,以毫秒计

self_time double precision

在这个函数本身花费的总时间,不包括被它调用的其他函数,以毫秒计


28.2.21. pg_stat_slru #

PostgreSQL 通过 SLRU(simple least-recently-used,简单最近最少使用)缓存访问某些磁盘上的信息。pg_stat_slru 视图将为每个被跟踪的 SLRU 缓存包含一行,显示关于访问缓存页面的统计信息。

表 28.31. pg_stat_slru 视图

列类型

描述

name text

SLRU 的名称

blks_zeroed bigint

初始化期间被置零的块数

blks_hit bigint

已经在 SLRU 中的磁盘块被发现的次数,因此不需要读取(这只包括 SLRU 中的命中,不包括操作系统的文件系统缓存中的命中)

blks_read bigint

为这个 SLRU 读取的磁盘块数

blks_written bigint

为这个 SLRU 写入的磁盘块数

blks_exists bigint

为这个 SLRU 检查是否存在的块数

flushes bigint

此 SLRU 的脏数据刷盘次数

truncates bigint

这个 SLRU 的截断次数

stats_reset timestamp with time zone

这些统计信息上次被重置的时间


28.2.22. 统计函数 #

其他查看统计信息的方法是直接使用查询,这些查询使用上述标准视图用到的底层统计信息访问函数。如要了解如函数名等细节,可参考标准视图的定义(例如,在 psql 中你可以发出\d+ pg_stat_activity)。针对每一个数据库统计信息的访问函数把一个数据库 OID 作为参数来标识要报告哪个数据库。而针对每个表和每个索引的函数要求表或索引 OID。针对每个函数统计信息的函数用一个函数 OID。注意只有在当前数据库中的表、索引和函数才能被这些函数看到。

与统计收集器相关的其他功能在表 28.32 中列出。

表 28.32. 附加统计函数

函数

描述

pg_backend_pid () → integer

返回附加到当前会话的服务器进程的进程 ID。

pg_stat_get_activity ( integer ) → setof record

使用指定的进程 ID 返回有关后端信息的记录,如果指定了 NULL,则返回系统中每个活动后端的一条记录。返回的字段是 pg_stat_activity 视图中字段的子集。

pg_stat_get_snapshot_timestamp () → timestamp with time zone

返回当前统计快照的时间戳。

pg_stat_get_xact_blocks_fetched ( oid ) → bigint

返回当前事务中表或索引的块读取请求次数。这个数字减去 pg_stat_get_xact_blocks_hit 给出了内核 read() 调用的次数;实际的物理读取次数通常较低,这是由于内核级别的缓冲。

pg_stat_get_xact_blocks_hit ( oid ) → bigint

返回在当前事务中在缓存中找到的表或索引的块读取请求次数(不触发内核 read() 调用)。

pg_stat_clear_snapshot () → void

丢弃当前的统计快照或缓存信息。

pg_stat_reset () → void

将当前数据库的所有统计计数器重置为零。

默认情况下,此函数仅限超级用户使用,但可以授予其他用户 EXECUTE 权限来运行该函数。

pg_stat_reset_shared ( text ) → void

根据参数将一些集簇范围的统计计数器重置为零。参数可以为 bgwriter,用于重置 pg_stat_bgwriter 视图中显示的所有计数器;archiver,用于重置 pg_stat_archiver 视图中显示的所有计数器;或 wal,用于重置 pg_stat_wal 视图中显示的所有计数器。

默认情况下,此函数仅限超级用户使用,但可以授予其他用户 EXECUTE 权限来运行该函数。

pg_stat_reset_single_table_counters ( oid ) → void

将当前数据库中单个表或索引的统计信息重置为零。

默认情况下,此函数仅限超级用户使用,但可以授予其他用户 EXECUTE 权限来运行该函数。

pg_stat_reset_single_function_counters ( oid ) → void

将当前数据库中单个函数的统计信息重置为零。

默认情况下,此函数仅限超级用户使用,但可以授予其他用户 EXECUTE 权限来运行该函数。

pg_stat_reset_slru ( text ) → void

将单个 SLRU 缓存或集簇中所有 SLRU 的统计信息重置为零。如果参数为空值,则重置 pg_stat_slru 视图中所有 SLRU 缓存的全部计数器。参数可以为 CommitTs、​MultiXactMember、​MultiXactOffset、​Notify、​Serial、​Subtrans 或 Xact 中的一个,以便只重置对应条目的计数器。如果参数为 other(实际上,任何无法识别的名称都可以),则重置其他所有 SLRU 缓存的计数器,例如扩展定义的缓存。

默认情况下,此函数仅限超级用户使用,但可以授予其他用户 EXECUTE 权限来运行该函数。

pg_stat_reset_replication_slot ( text ) → void

重置由参数定义的复制槽的统计信息。如果参数为 NULL,则重置所有复制槽的统计信息。

默认情况下,此函数仅限超级用户使用,但可以授予其他用户 EXECUTE 权限来运行该函数。


警告

使用 pg_stat_reset() 还会重置自动清理使用的计数器,以确定何时触发清理或分析。重置这些计数器可能导致自动清理不执行必要的工作,这可能会导致问题,如表膨胀或过时的表统计信息。建议在统计信息重置后进行全库 ANALYZE。

pg_stat_get_activity 是 pg_stat_activity 视图的底层函数,它返回一个行集合,其中包含有关每个后端进程所有可用的信息。有时只获得该信息的一个子集可能会更方便。在那些情况中,可以使用一组更老的针对每个后端的统计访问函数,这些显示在表 28.33 中。这些访问函数使用一个后端 ID 号,范围从 1 到当前活动后端数目。函数 pg_stat_get_backend_idset 提供了一种方便的方法为每个活动后端产生一行来调用这些函数。例如,要显示 PID 以及所有后端当前的查询:

SELECT pg_stat_get_backend_pid(s.backendid) AS pid,
       pg_stat_get_backend_activity(s.backendid) AS query
    FROM (SELECT pg_stat_get_backend_idset() AS backendid) AS s;

表 28.33. 按后端统计函数

函数

描述

pg_stat_get_backend_idset () → setof integer

返回当前活动后端 ID 号的集合(从 1 到活动后端数)。

pg_stat_get_backend_activity ( integer ) → text

返回此后端最近查询的文本。

pg_stat_get_backend_activity_start ( integer ) → timestamp with time zone

返回后端最近一次查询开始的时间。

pg_stat_get_backend_client_addr ( integer ) → inet

返回连接到此后端的客户端的 IP 地址。

pg_stat_get_backend_client_port ( integer ) → integer

返回客户端用于通信的 TCP 端口号。

pg_stat_get_backend_dbid ( integer ) → oid

返回此后端连接的数据库的 OID。

pg_stat_get_backend_pid ( integer ) → integer

返回此后端进程 ID。

pg_stat_get_backend_start ( integer ) → timestamp with time zone

返回该进程开始的时间。

pg_stat_get_backend_userid ( integer ) → oid

返回登录到此后端的用户的 OID。

pg_stat_get_backend_wait_event_type ( integer ) → text

如果后端当前正在等待,则返回等待事件类型名称,否则返回空值。请参阅表 28.4。

pg_stat_get_backend_wait_event ( integer ) → text

如果后端当前正在等待,则返回等待事件名称,否则为空值。请参阅表 28.5 到表 28.13。

pg_stat_get_backend_xact_start ( integer ) → timestamp with time zone

返回后端当前事务开始的时间。


报告文档问题

阅读 上游文档. 通过 PostgreSQL 文档反馈表单.