pg_stat_activitypg_stat_replicationpg_stat_replication_slotspg_stat_wal_receiverpg_stat_recovery_prefetchpg_stat_subscriptionpg_stat_subscription_statspg_stat_sslpg_stat_gssapipg_stat_archiverpg_stat_iopg_stat_bgwriterpg_stat_walpg_stat_databasepg_stat_database_conflictspg_stat_all_tablespg_stat_all_indexespg_statio_all_tablespg_statio_all_indexespg_statio_all_sequencespg_stat_user_functionspg_stat_slruPostgreSQL 的累积统计系统支持收集和报告有关服务器活动的信息。目前,以磁盘块和单行项来计算对表和索引的访问次数。还会计算每个表中的总行数,以及有关每个表的 vacuum 和 analyze 操作的信息。如果启用,还会计算对用户定义函数的调用以及在每个函数中花费的总时间。
PostgreSQL 还支持报告有关系统中当前正在发生的事情的动态信息,例如其他服务器进程当前正在执行的确切命令,以及系统中存在的其他连接。此功能独立于累积统计系统。
由于收集统计信息会给查询执行增加一些开销,因此可以将系统配置为收集或不收集信息。这由通常在 postgresql.conf 中设置的配置参数控制。(有关设置配置参数的详细信息,请参见第 20 章。)
参数 track_activities 启用对任何服务器进程正在执行的当前命令的监视。
参数 track_counts 控制是否收集有关表和索引访问的累积统计信息。
参数 track_functions 启用对用户定义函数使用情况的跟踪。
参数 track_io_timing 启用对块读取和写入时间的监视。
参数 track_wal_io_timing 启用对 WAL 写入时间的监视。
通常,这些参数在 postgresql.conf 中设置,以便应用于所有服务器进程,但可以使用 SET 命令在各个会话中将其打开或关闭。(为了防止普通用户向管理员隐藏其活动,只有超级用户才能使用 SET 更改这些参数。)
累积统计信息收集在共享内存中。每个 PostgreSQL 进程在本地收集统计信息,然后在适当的时间间隔更新共享数据。当服务器(包括物理副本)正常关闭时,统计信息数据的永久副本存储在 pg_stat 子目录中,以便可以在服务器重新启动后保留统计信息。相反,从不正常关闭启动时(例如,在立即关闭、服务器崩溃、从基本备份启动和时间点恢复后),所有统计信息计数器都会重置。
在 表 28.1 中列出的几个预定义视图可用于显示系统的当前状态。还有几个其他视图,在 表 28.2 中列出,可用于显示累积统计信息。或者,可以使用基础累积统计信息函数构建自定义视图,如 第 28.2.25 节 中所述。
在使用累积统计信息视图和函数监视收集的数据时,重要的是要认识到信息不会立即更新。每个单独的服务器进程在进入空闲状态之前将累积的统计信息刷新到共享内存中,但不会比每 PGSTAT_MIN_INTERVAL 毫秒(1 秒,除非在构建服务器时更改)更频繁;因此,仍处于进行中的查询或事务不会影响显示的总数,并且显示的信息会滞后于实际活动。但是,track_activities 收集的当前查询信息始终是最新的。
另一个重要问题是,当要求服务器进程显示任何累积的统计信息时,在默认配置中,访问的值会被缓存,直至其当前事务结束。因此,只要您继续当前事务,统计信息就会显示静态信息。类似地,当在事务中首次请求任何此类信息时,会收集所有会话的当前查询的信息,并且在整个事务中会显示相同的信息。这是一个特性,而不是一个错误,因为它允许您对统计信息执行多个查询,并且无需担心数字在您不知情的情况下发生变化,从而关联结果。在交互式分析统计信息或使用昂贵的查询时,访问各个统计信息之间的时间差可能导致缓存的统计信息出现显著偏差。为了最大程度地减少偏差,可以将 stats_fetch_consistency 设置为 snapshot,代价是增加不必要的统计数据缓存的内存使用量。相反,如果已知只访问统计信息一次,则缓存访问的统计信息是不必要的,可以通过将 stats_fetch_consistency 设置为 none 来避免缓存。您可以调用 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_recovery_prefetch |
仅一行,显示有关在恢复期间预取的块的统计信息。有关详细信息,请参见 pg_stat_recovery_prefetch。 |
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.4 节。 |
pg_stat_progress_vacuum |
为运行 VACUUM 的每个后端(包括自动清理工作进程)提供一行,显示当前进度。请参阅 第 28.4.5 节。 |
pg_stat_progress_cluster |
为运行 CLUSTER 或 VACUUM FULL 的每个后端提供一行,显示当前进度。请参阅 第 28.4.2 节。 |
pg_stat_progress_basebackup |
为每个流式传输基础备份的 WAL 发送器进程提供一行,显示当前进度。请参阅 第 28.4.6 节。 |
pg_stat_progress_copy |
为运行 COPY 的每个后端提供一行,显示当前进度。请参阅 第 28.4.3 节。 |
表 28.2. 收集的统计信息视图
| 视图名称 | 说明 |
|---|---|
pg_stat_archiver |
只有一行,显示有关 WAL 归档器进程活动情况的统计信息。有关详细信息,请参阅 pg_stat_archiver。 |
pg_stat_bgwriter |
只有一行,显示有关后台写入器进程活动情况的统计信息。有关详细信息,请参阅 pg_stat_bgwriter。 |
pg_stat_database |
每个数据库一行,显示数据库范围内的统计信息。有关详细信息,请参阅 pg_stat_database。 |
pg_stat_database_conflicts |
每行一个数据库,显示有关查询取消的数据库范围统计信息,因为与备用服务器上的恢复冲突。有关详细信息,请参见 pg_stat_database_conflicts。 |
pg_stat_io |
对于后端类型、上下文和包含集群范围 I/O 统计信息的目标对象的每种组合,一行。有关详细信息,请参见 pg_stat_io。 |
pg_stat_replication_slots |
每行一个复制槽,显示有关复制槽使用情况的统计信息。有关详细信息,请参见 pg_stat_replication_slots。 |
pg_stat_slru |
每行一个 SLRU,显示操作统计信息。有关详细信息,请参见 pg_stat_slru。 |
pg_stat_subscription_stats |
每行一个订阅,显示有关错误的统计信息。有关详细信息,请参见 pg_stat_subscription_stats。 |
pg_stat_wal |
只有一行,显示有关 WAL 活动的统计信息。有关详细信息,请参见 pg_stat_wal。 |
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 和相关视图中)。此视图中不存在活动行和死行数以及 vacuum 和分析操作的列。 |
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_stat_user_functions |
每个跟踪函数的一行,显示有关该函数执行的统计信息。有关详细信息,请参见 pg_stat_user_functions。 |
pg_stat_xact_user_functions |
类似于 pg_stat_user_functions,但仅统计当前事务期间的调用(尚未 包含在 pg_stat_user_functions 中)。 |
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_io 和 pg_statio_ 视图集对于确定缓冲区高速缓存的有效性很有用。它们可用于计算高速缓存命中率。请注意,虽然 PostgreSQL 的 I/O 统计信息会捕获内核被调用以执行 I/O 的大多数实例,但它们不会区分必须从磁盘获取的数据和已经驻留在内核页面高速缓存中的数据。建议用户将 PostgreSQL 统计信息视图与操作系统实用程序结合使用,以更全面地了解其数据库的 I/O 性能。
pg_stat_activity #pg_stat_activity 视图将针对每个服务器进程有一行,显示与该进程当前活动相关的信息。
表 28.3. pg_stat_activity 视图
|
列类型 说明 |
|---|
|
此后端连接到的数据库的 OID |
|
此后端连接到的数据库的名称 |
|
此后端的进程 ID |
|
如果此进程是并行查询工作进程,则为并行组负责人的进程 ID;如果此进程是并行应用工作进程,则为负责人的进程 ID。 |
|
登录到此后端的用户的 OID |
|
登录到此后端的用户的名称 |
|
连接到此后端的应用程序的名称 |
|
连接到此后端的客户端的 IP 地址。如果此字段为 null,则表示客户端通过服务器机器上的 Unix 套接字连接,或者这是一个内部进程,例如自动清理。 |
|
|
|
客户端用于与此后端通信的 TCP 端口号,或者如果使用 Unix 套接字,则为 |
|
此进程启动的时间。对于客户端后端,这是客户端连接到服务器的时间。 |
|
此进程当前事务启动的时间,或者如果没有任何活动的事务,则为 null。如果当前查询是其事务的第一个查询,则此列等于 |
|
当前活动查询启动的时间,或者如果 |
|
|
|
后端正在等待的事件类型(如果有);否则为 NULL。请参阅 表 28.4。 |
|
|
|
此后端的当前总体状态。可能的值为
|
|
此后端的顶级事务标识符(如果存在);请参阅 第 74.1 节。 |
|
当前后端的 |
|
此后端最近查询的标识符。如果 |
|
此后端最近查询的文本。如果 |
|
当前后端的类型。可能类型为 |
wait_event 和 state 列是独立的。如果后端处于 active 状态,则它可能或可能不会在某个事件上 waiting。如果状态为 active 且 wait_event 为非空,则表示正在执行查询,但该查询在系统中的某个位置被阻止。
表 28.4 等待事件类型
| 等待事件类型 | 说明 |
|---|---|
活动 |
服务器进程处于空闲状态。此事件类型表示进程在其主处理循环中等待活动。wait_event 将标识特定的等待点;请参阅 表 28.5。 |
BufferPin |
服务器进程正在等待对数据缓冲区的独占访问。如果另一个进程持有上一次从所讨论缓冲区读取数据的打开游标,则缓冲区 pin 等待可能会延长。请参阅 表 28.6。 |
Client |
服务器进程正在等待与用户应用程序连接的套接字上的活动。因此,服务器期望发生与其内部进程无关的事情。wait_event 将标识特定的等待点;请参阅 表 28.7。 |
Extension |
服务器进程正在等待扩展模块定义的某个条件。请参阅 表 28.8。 |
IO |
服务器进程正在等待 I/O 操作完成。wait_event 将标识特定的等待点;请参阅 表 28.9。 |
IPC |
服务器进程正在等待与另一个服务器进程进行一些交互。wait_event 将标识特定的等待点;请参阅 表 28.10。 |
锁 |
服务器进程正在等待一个重量级锁。重量级锁,又称为锁管理器锁或简称锁,主要保护 SQL 可见对象,例如表。但是,它们还用于确保某些内部操作的互斥,例如关系扩展。wait_event 将识别等待的锁类型;请参见 表 28.11。 |
LWLock |
服务器进程正在等待一个轻量级锁。大多数此类锁保护共享内存中的特定数据结构。wait_event 将包含一个标识轻量级锁用途的名称。(某些锁具有特定名称;其他锁属于一组锁,每个锁具有类似用途。)请参见 表 28.12。 |
超时 |
服务器进程正在等待超时到期。wait_event 将识别特定的等待点;请参见 表 28.13。 |
表 28.5. Activity 类型等待事件
Activity 等待事件 |
说明 |
|---|---|
ArchiverMain |
在归档器进程的主循环中等待。 |
AutoVacuumMain |
在自动清理启动器进程的主循环中等待。 |
BgWriterHibernate |
在后台写入器进程中等待,休眠中。 |
BgWriterMain |
在后台写入器进程的主循环中等待。 |
CheckpointerMain |
在检查点进程的主循环中等待。 |
LogicalApplyMain |
在逻辑复制应用进程的主循环中等待。 |
LogicalLauncherMain |
在逻辑复制启动器进程的主循环中等待。 |
LogicalParallelApplyMain |
在逻辑复制并行应用进程的主循环中等待。 |
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 |
等待基本备份从文件中读取。 |
BaseBackupSync |
等待基本备份写入的数据到达持久性存储。 |
BaseBackupWrite |
等待基本备份写入文件。 |
BufFileRead |
等待从缓冲文件中读取。 |
BufFileTruncate |
等待缓冲文件被截断。 |
BufFileWrite |
等待写入缓冲文件。 |
ControlFileRead |
等待从 pg_control 文件读取。 |
ControlFileSync |
等待 pg_control 文件到达持久性存储。 |
ControlFileSyncUpdate |
等待对 pg_control 文件的更新到达持久性存储。 |
ControlFileWrite |
等待写入 pg_control 文件。 |
ControlFileWriteUpdate |
等待写入更新 pg_control 文件。 |
CopyFileRead |
在文件复制操作期间等待读取。 |
CopyFileWrite |
在文件复制操作期间等待写入。 |
DSMAllocate |
等待分配动态共享内存段。 |
DSMFillZeroWrite |
等待用零填充动态共享内存后备文件。 |
DataFileExtend |
等待关系数据文件扩展。 |
DataFileFlush |
等待关系数据文件到达持久存储。 |
DataFileImmediateSync |
等待关系数据文件立即同步到持久存储。 |
DataFilePrefetch |
等待从关系数据文件异步预取。 |
DataFileRead |
等待从关系数据文件读取。 |
DataFileSync |
等待关系数据文件中的更改到达持久存储。 |
DataFileTruncate |
等待关系数据文件被截断。 |
DataFileWrite |
等待写入关系数据文件。 |
LockFileAddToDataDirRead |
等待在将行添加到数据目录锁定文件时读取。 |
LockFileAddToDataDirSync |
等待在将行添加到数据目录锁定文件时数据到达持久存储。 |
LockFileAddToDataDirWrite |
等待在将行添加到数据目录锁定文件时写入。 |
LockFileCreateRead |
等待在创建数据目录锁定文件时读取。 |
LockFileCreateSync |
等待在创建数据目录锁定文件时数据到达持久存储。 |
LockFileCreateWrite |
等待在创建数据目录锁定文件时写入。 |
LockFileReCheckDataDirRead |
等待在重新检查数据目录锁定文件时读取。 |
LogicalRewriteCheckpointSync |
等待在检查点期间逻辑重写映射到达持久存储。 |
LogicalRewriteMappingSync |
等待在逻辑重写期间映射数据到达持久存储。 |
LogicalRewriteMappingWrite |
等待在逻辑重写期间写入映射数据。 |
LogicalRewriteSync |
等待逻辑重写映射到达持久存储。 |
LogicalRewriteTruncate |
等待在逻辑重写期间截断映射数据。 |
LogicalRewriteWrite |
等待写入逻辑重写映射。 |
RelationMapRead |
等待读取关系映射文件。 |
RelationMapReplace |
等待持久替换关系映射文件。 |
RelationMapWrite |
等待写入关系映射文件。 |
ReorderBufferRead |
等待在重新排序缓冲区管理期间读取。 |
ReorderBufferWrite |
等待在重新排序缓冲区管理期间写入。 |
重新排序逻辑映射读取 |
在重新排序缓冲区管理期间等待读取逻辑映射。 |
复制槽读取 |
等待从复制槽控制文件读取。 |
复制槽恢复同步 |
在将复制槽控制文件恢复到内存时,等待该文件达到持久存储。 |
复制槽同步 |
等待复制槽控制文件达到持久存储。 |
复制槽写入 |
等待写入复制槽控制文件。 |
SLRU 刷新同步 |
在检查点或数据库关闭期间,等待 SLRU 数据达到持久存储。 |
SLRU 读取 |
等待读取 SLRU 页。 |
SLRU 同步 |
在页面写入后,等待 SLRU 数据达到持久存储。 |
SLRU 写入 |
等待写入 SLRU 页。 |
快照构建读取 |
等待读取序列化的历史目录快照。 |
快照构建同步 |
等待序列化的历史目录快照达到持久存储。 |
快照构建写入 |
等待写入序列化的历史目录快照。 |
时间线历史文件同步 |
等待通过流复制接收的时间线历史文件达到持久存储。 |
时间线历史文件写入 |
等待通过流复制接收的时间线历史文件写入。 |
时间线历史读取 |
等待读取时间线历史文件。 |
时间线历史同步 |
等待新创建的时间线历史文件达到持久存储。 |
时间线历史写入 |
等待写入新创建的时间线历史文件。 |
两阶段文件读取 |
等待读取两阶段状态文件。 |
两阶段文件同步 |
等待两阶段状态文件达到持久存储。 |
两阶段文件写入 |
等待写入两阶段状态文件。 |
版本文件同步 |
在创建数据库时,等待版本文件达到持久存储。 |
版本文件写入 |
在创建数据库时,等待写入版本文件。 |
WAL 引导同步 |
在引导期间,等待 WAL 达到持久存储。 |
WAL 引导写入 |
在引导期间,等待写入 WAL 页。 |
WAL 复制读取 |
等待在复制现有 WAL 段时创建新 WAL 段的读取操作。 |
WALCopySync |
等待通过复制现有 WAL 段创建的新 WAL 段到达持久性存储。 |
WALCopyWrite |
等待在复制现有 WAL 段时创建新 WAL 段的写入操作。 |
WALInitSync |
等待新初始化的 WAL 文件到达持久性存储。 |
WALInitWrite |
等待在初始化新 WAL 文件时的写入操作。 |
WALRead |
等待从 WAL 文件读取。 |
WALSenderTimelineHistoryRead |
等待在 walsender 时间线命令期间从时间线历史文件读取。 |
WALSync |
等待 WAL 文件到达持久性存储。 |
WALSyncMethodAssign |
等待在分配新的 WAL 同步方法时数据到达持久性存储。 |
WALWrite |
等待写入 WAL 文件。 |
表 28.10. 类型为 IPC 的等待事件
IPC 等待事件 |
说明 |
|---|---|
AppendReady |
等待 Append 计划节点的子计划节点就绪。 |
ArchiveCleanupCommand |
等待 archive_cleanup_command 完成。 |
ArchiveCommand |
等待 archive_command 完成。 |
BackendTermination |
等待另一个后端的终止。 |
BackupWaitWalArchive |
等待备份所需的 WAL 文件成功归档。 |
BgWorkerShutdown |
等待后台工作程序关闭。 |
BgWorkerStartup |
等待后台工作程序启动。 |
BtreePage |
等待继续并行 B 树扫描所需的页码可用。 |
BufferIO |
等待缓冲区 I/O 完成。 |
CheckpointDone |
等待检查点完成。 |
CheckpointStart |
等待检查点开始。 |
ExecuteGather |
等待在执行 Gather 计划节点时的子进程活动。 |
HashBatchAllocate |
等待选定的并行哈希参与者分配哈希表。 |
HashBatchElect |
等待选出并行哈希参与者以分配哈希表。 |
HashBatchLoad |
等待其他并行哈希参与者完成哈希表加载。 |
HashBuildAllocate |
等待选出的并行哈希参与者分配初始哈希表。 |
HashBuildElect |
等待选出并行哈希参与者以分配初始哈希表。 |
HashBuildHashInner |
等待其他并行哈希参与者完成内部关系的哈希化。 |
HashBuildHashOuter |
等待其他并行哈希参与者完成外部关系的分区。 |
HashGrowBatchesDecide |
等待选出并行哈希参与者以决定未来的批处理增长。 |
HashGrowBatchesElect |
等待选出并行哈希参与者以分配更多批处理。 |
HashGrowBatchesFinish |
等待选出的并行哈希参与者决定未来的批处理增长。 |
HashGrowBatchesReallocate |
等待选出的并行哈希参与者分配更多批处理。 |
HashGrowBatchesRepartition |
等待其他并行哈希参与者完成重新分区。 |
HashGrowBucketsElect |
等待选出并行哈希参与者以分配更多存储桶。 |
HashGrowBucketsReallocate |
等待选出的并行哈希参与者完成分配更多存储桶。 |
HashGrowBucketsReinsert |
等待其他并行哈希参与者完成将元组插入新存储桶。 |
LogicalApplySendData |
等待逻辑复制领导应用进程向并行应用进程发送数据。 |
LogicalParallelApplyStateChange |
等待逻辑复制并行应用进程更改状态。 |
LogicalSyncData |
等待逻辑复制远程服务器发送初始表同步数据。 |
LogicalSyncStateChange |
等待逻辑复制远程服务器更改状态。 |
MessageQueueInternal |
等待另一个进程附加到共享消息队列。 |
MessageQueuePutMessage |
等待将协议消息写入共享消息队列。 |
MessageQueueReceive |
等待从共享消息队列接收字节。 |
MessageQueueSend |
等待向共享消息队列发送字节。 |
ParallelBitmapScan |
等待并行位图扫描初始化。 |
ParallelCreateIndexScan |
等待并行 CREATE INDEX 工作进程完成堆扫描。 |
ParallelFinish |
等待并行工作进程完成计算。 |
ProcArrayGroupUpdate |
等待组长在并行操作结束时清除事务 ID。 |
ProcSignalBarrier |
等待所有后端处理屏障事件。 |
Promote |
等待备用提升。 |
RecoveryConflictSnapshot |
等待恢复冲突解决,以便进行 vacuum 清理。 |
RecoveryConflictTablespace |
等待恢复冲突解决,以便删除表空间。 |
RecoveryEndCommand |
等待 recovery_end_command 完成。 |
RecoveryPause |
等待恢复继续。 |
ReplicationOriginDrop |
等待复制源变为非活动状态,以便将其删除。 |
ReplicationSlotDrop |
等待复制槽变为非活动状态,以便将其删除。 |
RestoreCommand |
等待 restore_command 完成。 |
SafeSnapshot |
等待获取 READ ONLY DEFERRABLE 事务的有效快照。 |
SyncRep |
在同步复制期间等待来自远程服务器的确认。 |
WalReceiverExit |
等待 WAL 接收器退出。 |
WalReceiverWaitStart |
等待启动进程发送流复制的初始数据。 |
XactGroupUpdate |
等待组长在并行操作结束时更新事务状态。 |
表 28.11. 类型为 Lock 的等待事件
Lock 等待事件 |
说明 |
|---|---|
advisory |
等待获取建议用户锁。 |
applytransaction |
等待获取逻辑复制订阅者应用的远程事务的锁。 |
extend |
等待扩展关系。 |
frozenid |
等待更新 pg_database.datfrozenxid 和 pg_database.datminmxid。 |
object |
等待获取非关系数据库对象的锁。 |
page |
等待获取关系页面的锁。 |
relation |
等待获取关系的锁。 |
spectoken |
等待获取一个推测插入锁。 |
事务 ID |
等待事务完成。 |
元组 |
等待获取元组上的锁。 |
用户锁 |
等待获取用户锁。 |
虚拟事务 ID |
等待获取虚拟事务 ID 锁;请参见第 74.1 节。 |
表 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 |
等待读取或更新有关“重量级”锁的信息。 |
LogicalRepLauncherDSA |
等待访问逻辑复制启动器的动态共享内存分配器。 |
LogicalRepLauncherHash |
等待访问逻辑复制启动器的共享哈希表。 |
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 |
等待在并行追加计划执行期间选择下一个子计划。 |
ParallelHashJoin |
等待在并行哈希连接计划执行期间同步工作进程。 |
ParallelQueryDSA |
等待并行查询动态共享内存分配。 |
PerSessionDSA |
等待并行查询动态共享内存分配。 |
PerSessionRecordType |
等待访问并行查询中有关复合类型的信息。 |
PerSessionRecordTypmod |
等待访问并行查询中有关标识匿名记录类型的类型修改符的信息。 |
PerXactPredicateList |
等待在并行查询期间访问当前可序列化事务持有的谓词锁列表。 |
PgStatsData |
等待共享内存统计数据访问 |
PgStatsDSA |
等待统计动态共享内存分配器访问 |
PgStatsHash |
等待统计共享内存哈希表访问 |
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 和 multixact 消耗的限制。 |
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 |
在向检查点发送同步请求时等待,因为请求队列已满。 |
SpinDelay |
在获取争用的自旋锁时等待。 |
VacuumDelay |
在基于成本的 Vacuum 延迟点等待。 |
VacuumTruncate |
等待获取排他锁以截断 Vacuum 表末尾的任何空页面。 |
以下是查看等待事件的示例
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)
pg_stat_replication #pg_stat_replication 视图将包含每个 WAL 发送进程一行,显示有关复制到该发送进程连接的备用服务器的统计信息。仅列出直接连接的备用服务器;没有关于下游备用服务器的信息。
表 28.14。pg_stat_replication 视图
|
列类型 说明 |
|---|
|
WAL 发送进程的进程 ID |
|
登录到此 WAL 发送进程的用户 OID |
|
登录到此 WAL 发送进程的用户名 |
|
连接到此 WAL 发送进程的应用程序的名称 |
|
连接到此 WAL 发送方的客户端的 IP 地址。如果此字段为空,则表示客户端通过服务器计算机上的 Unix 套接字进行连接。 |
|
|
|
客户端用于与此 WAL 发送方通信的 TCP 端口号,或如果使用 Unix 套接字,则为 |
|
此进程启动的时间,即客户端连接到此 WAL 发送方的时间 |
|
此备用服务器的 |
|
当前 WAL 发送方状态。可能的值为
|
|
在此连接上发送的最后一个预写日志位置 |
|
此备用服务器写入磁盘的最后一个预写日志位置 |
|
此备用服务器刷新到磁盘的最后一个预写日志位置 |
|
此备用服务器上重放到数据库中的最后一个预写日志位置 |
|
在本地刷新最近的 WAL 和收到此备用服务器已写入(但尚未刷新或应用)它的通知之间经过的时间。如果此服务器配置为同步备用服务器,则可用于衡量在提交时 |
|
在本地刷新最近的 WAL 与收到通知表明此备用服务器已写入并刷新它(但尚未应用它)之间经过的时间。如果此服务器配置为同步备用,则可用于衡量在提交期间 |
|
在本地刷新最近的 WAL 与收到通知表明此备用服务器已写入、刷新并应用它之间经过的时间。如果此服务器配置为同步备用,则可用于衡量在提交期间 |
|
在基于优先级的同步复制中,此备用服务器作为同步备用被选中的优先级。在基于法定人数的同步复制中,此项无效。 |
|
此备用服务器的同步状态。可能的值为
|
|
从备用服务器收到的上次回复消息的发送时间 |
在 pg_stat_replication 视图中报告的滞后时间是最近的 WAL 被写入、刷新和重放以及发送方知道它所花费的时间的测量值。如果远程服务器配置为同步备用,则这些时间表示每个同步提交级别引入的(或将引入的)提交延迟。对于异步备用,replay_lag 列近似于最近的事务对查询可见之前的延迟。如果备用服务器已完全赶上发送服务器并且没有更多 WAL 活动,则最近测量的滞后时间将继续显示一小段时间,然后显示 NULL。
滞后时间自动适用于物理复制。逻辑解码插件可以选择发出跟踪消息;如果它们不发出,则跟踪机制将仅显示 NULL 滞后。
报告的滞后时间不是对备用服务器赶上发送服务器所需时间的预测,假设重放的当前速率。这样的系统在生成新的 WAL 时会显示类似的时间,但在发送服务器变为闲置时会不同。特别是,当备用服务器已完全赶上时,pg_stat_replication 显示的是写入、刷新和重放最近报告的 WAL 位置所需的时间,而不是某些用户可能预期的零。这与衡量最近写入事务的同步提交和事务可见性延迟的目标是一致的。为了减少对预期不同滞后模型的用户造成的困惑,在完全重放的闲置系统上,滞后列会在短时间后变为 NULL。监控系统应选择将其表示为缺失数据、零或继续显示最后已知值。
pg_stat_replication_slots #视图 pg_stat_replication_slots 将包含每条逻辑复制槽一行,显示有关其使用情况的统计信息。
表 28.15. pg_stat_replication_slots 视图
|
列类型 说明 |
|---|
|
复制槽的唯一集群范围标识符 |
|
事务溢出到磁盘的次数,一旦逻辑解码用于从 WAL 解码更改所使用的内存超过 |
|
为该槽解码 WAL 中的更改时,事务溢出到磁盘的次数。每次溢出事务时,此计数器都会增加,并且同一个事务可能会溢出多次。 |
|
为该槽执行 WAL 中更改的解码时,溢出到磁盘的解码事务数据量。此计数器和其他溢出计数器可用于衡量逻辑解码期间发生的 I/O,并允许调整 |
|
在用于解码 WAL 中的更改的逻辑解码所使用的内存超过 |
|
在为该插槽解码 WAL 中的更改时,正在进行的事务流式传输到解码输出插件的次数。每次事务被流式传输时,此计数器都会递增,并且同一事务可能会被流式传输多次。 |
|
在为该插槽解码 WAL 中的更改时,为流式传输正在进行的事务到解码输出插件而解码的事务数据量。此计数器和该插槽的其他流式传输计数器可用于调整 |
|
发送到该插槽的解码输出插件的已解码事务数。这仅计算顶级事务,不会为子事务递增。请注意,这包括被流式传输和/或溢出的事务。 |
|
在为该插槽解码 WAL 中的更改时,为将事务发送到解码输出插件而解码的事务数据量。请注意,这包括被流式传输和/或溢出的数据。 |
|
上次重置这些统计信息的时间 |
pg_stat_wal_receiver #pg_stat_wal_receiver 视图将只包含一行,显示来自该接收器的连接服务器的 WAL 接收器的统计信息。
表 28.16. pg_stat_wal_receiver 视图
|
列类型 说明 |
|---|
|
WAL 接收器进程的进程 ID |
|
WAL 接收器进程的活动状态 |
|
WAL 接收器启动时使用的第一个预写日志位置 |
|
WAL 接收器启动时使用的第一个时间线号 |
|
已接收并写入磁盘但尚未刷新的最后一个预写日志位置。不应将其用于数据完整性检查。 |
|
已接收并刷新到磁盘的最后一个预写式日志位置,此字段的初始值是 WAL 接收器启动时使用的第一个日志位置 |
|
已接收并刷新到磁盘的最后一个预写式日志位置的时间线编号,此字段的初始值是 WAL 接收器启动时使用的第一个日志位置的时间线编号 |
|
从原始 WAL 发送器接收到的最后一条消息的发送时间 |
|
从原始 WAL 发送器接收到的最后一条消息的接收时间 |
|
报告给原始 WAL 发送器的最后一个预写式日志位置 |
|
报告给原始 WAL 发送器的最后一个预写式日志位置的时间 |
|
此 WAL 接收器使用的复制槽名称 |
|
此 WAL 接收器连接到的 PostgreSQL 实例的主机。这可以是主机名、IP 地址或目录路径(如果连接通过 Unix 套接字)。(路径情况可以区分,因为它始终是绝对路径,以 |
|
此 WAL 接收器连接到的 PostgreSQL 实例的端口号。 |
|
此 WAL 接收器使用的连接字符串,其中安全敏感字段已混淆。 |
pg_stat_recovery_prefetch #视图 pg_stat_recovery_prefetch 将只包含一行。列 wal_distance、block_distance 和 io_depth 显示当前值,而其他列显示可使用 pg_stat_reset_shared 函数重置的累积计数器。
表 28.17. pg_stat_recovery_prefetch 视图
|
列类型 说明 |
|---|
|
上次重置这些统计信息的时间 |
|
因不在缓冲池中而预取的块数 |
|
因已在缓冲池中而未预取的块数 |
|
由于零初始化,因此未预取的块数 |
|
由于尚未存在,因此未预取的块数 |
|
由于 WAL 中包含全页图像,因此未预取的块数 |
|
由于最近已预取,因此未预取的块数 |
|
预取器向前查找的字节数 |
|
预取器向前查找的块数 |
|
已启动但尚未知道已完成的预取数 |
pg_stat_subscription #表 28.18. pg_stat_subscription 视图
|
列类型 说明 |
|---|
|
订阅的 OID |
|
订阅的名称 |
|
订阅工作进程的进程 ID |
|
如果此进程是并行应用工作进程,则为领导应用工作进程的进程 ID;如果此进程是领导应用工作进程或同步工作进程,则为 NULL |
|
工作进程正在同步的关系的 OID;对于领导应用工作进程和并行应用工作进程,为 NULL |
|
收到的最后一个预写日志位置,此字段的初始值为 0;对于并行应用工作进程,为 NULL |
|
从原始 WAL 发送方收到的最后一条消息的发送时间;对于并行应用工作进程,为 NULL |
|
从原始 WAL 发送方收到的最后一条消息的接收时间;对于并行应用工作进程,为 NULL |
|
报告给原始 WAL 发送方的最后一个预写日志位置;对于并行应用工作进程,为 NULL |
|
报告给原始 WAL 发送方的最后一个预写日志位置的时间;对于并行应用工作进程,为 NULL |
pg_stat_subscription_stats #pg_stat_subscription_stats 视图将包含每个订阅一行。
表 28.19. pg_stat_subscription_stats 视图
|
列类型 说明 |
|---|
|
订阅的 OID |
|
订阅的名称 |
|
应用更改时发生的错误次数 |
|
初始表同步期间发生的错误次数 |
|
上次重置这些统计信息的时间 |
pg_stat_ssl #对于每个后端或 WAL 发送者进程,pg_stat_ssl 视图将包含一行,显示此连接上 SSL 使用情况的统计信息。它可以连接到 pg_stat_activity 或 pg_stat_replication 上的 pid 列,以获取有关连接的更多详细信息。
表 28.20. pg_stat_ssl 视图
|
列类型 说明 |
|---|
|
后端或 WAL 发送者进程的进程 ID |
|
如果此连接上使用 SSL,则为 True |
|
正在使用的 SSL 版本,如果此连接上未使用 SSL,则为 NULL |
|
正在使用的 SSL 密码的名称,如果此连接上未使用 SSL,则为 NULL |
|
所用加密算法中的位数,如果此连接上未使用 SSL,则为 NULL |
|
所用客户端证书中的专有名称 (DN) 字段,如果未提供客户端证书或此连接上未使用 SSL,则为 NULL。如果 DN 字段长度超过 |
|
客户端证书的序列号,如果未提供客户端证书或此连接上未使用 SSL,则为 NULL。证书序列号和证书颁发者的组合唯一标识证书(除非颁发者错误地重复使用序列号)。 |
|
客户端证书颁发者的 DN,如果未提供客户端证书或此连接上未使用 SSL,则为 NULL。此字段的截断方式与 |
pg_stat_gssapi #视图 pg_stat_gssapi 将包含每台后端一行,显示有关此连接上 GSSAPI 使用情况的信息。它可以与 pg_stat_activity 或 pg_stat_replication 连接到 pid 列以获取有关连接的更多详细信息。
表 28.21。pg_stat_gssapi 视图
|
列类型 说明 |
|---|
|
后端的进程 ID |
|
如果此连接使用 GSSAPI 身份验证,则为 True |
|
用于对该连接进行身份验证的主体,如果未使用 GSSAPI 对该连接进行身份验证,则为 NULL。如果主体长度超过 |
|
如果此连接上正在使用 GSSAPI 加密,则为 True |
|
如果此连接上已委派 GSSAPI 凭据,则为 True。 |
pg_stat_archiver #视图 pg_stat_archiver 将始终有一行,其中包含有关集群归档器进程的数据。
表 28.22。pg_stat_archiver 视图
|
列类型 说明 |
|---|
|
已成功归档的 WAL 文件数 |
|
最近成功归档的 WAL 文件的名称 |
|
最近一次成功归档操作的时间 |
|
归档 WAL 文件的失败尝试次数 |
|
最近一次归档操作失败的 WAL 文件的名称 |
|
最近一次归档操作失败的时间 |
|
上次重置这些统计信息的时间 |
通常,WAL 文件按从旧到新的顺序归档,但不能保证,并且在特殊情况下(例如提升备用或崩溃恢复后)不成立。因此,不能安全地假设所有早于 last_archived_wal 的文件也已成功归档。
pg_stat_io #视图 pg_stat_io 将包含后端类型、目标 I/O 对象和 I/O 上下文的每种组合的一行,显示集群范围的 I/O 统计信息。不合理的组合将被忽略。
目前,正在跟踪关系(例如表、索引)上的 I/O。但是,目前未跟踪绕过共享缓冲区的关联 I/O(例如,将表从一个表空间移动到另一个表空间时)。
表 28.23。pg_stat_io 视图
|
列类型 说明 |
|---|
|
后端类型(例如后台工作程序、自动清理工作程序)。有关 |
|
I/O 操作的目标对象。可能的值为
|
|
I/O 操作的上下文。可能的值为
|
|
读取操作的数量,每个操作的大小在 |
|
读取操作花费的时间(以毫秒为单位)(如果启用了 track_io_timing,否则为零) |
|
写入操作的数量,每个操作的大小在 |
|
以毫秒为单位的写入操作所花费的时间(如果 track_io_timing 已启用,否则为零) |
|
进程请求内核写入到永久存储的 |
|
以毫秒为单位的写回操作所花费的时间(如果 track_io_timing 已启用,否则为零)。这包括排队写出请求所花费的时间,以及可能写出脏数据所花费的时间。 |
|
关系扩展操作数,每个大小均在 |
|
以毫秒为单位的扩展操作所花费的时间(如果 track_io_timing 已启用,否则为零) |
|
每次 I/O 读、写或扩展的字节数。 关系数据读、写和扩展以 |
|
在共享缓冲区中找到所需块的次数。 |
|
从共享或本地缓冲区写出块的次数,以便使其可用于其他用途。 在 |
|
在 |
|
|
|
以毫秒为单位在 fsync 操作中花费的时间(如果启用了 track_io_timing,否则为零) |
|
上次重置这些统计信息的时间。 |
某些后端类型从不针对某些 I/O 对象和/或在某些 I/O 上下文中执行 I/O 操作。这些行从视图中省略。例如,检查点程序不会对临时表进行检查点,因此对于 backend_type checkpointer 和 object temp relation,不会有行。
此外,某些后端类型或在某些 I/O 对象和/或在某些 I/O 上下文中永远不会执行某些 I/O 操作。这些单元格将为 NULL。例如,临时表不会 fsync,因此对于 object temp relation,fsyncs 将为 NULL。此外,后台写入程序不执行读取,因此对于 backend_type background writer 的行,reads 将为 NULL。
pg_stat_io 可用于告知数据库调优。例如
跟踪 I/O 时间的列仅在启用 track_io_timing 时才为非零。如果自上次统计信息重置以来一直未启用 track_io_timing,则用户在引用这些列及其相应的 IO 操作时应小心。
pg_stat_bgwriter #pg_stat_bgwriter 视图始终只有一行,其中包含集群的全局数据。
表 28.24. pg_stat_bgwriter 视图
|
列类型 说明 |
|---|
|
已执行的计划检查点数量 |
|
已执行的请求检查点数量 |
|
在检查点处理部分(将文件写入磁盘)中花费的总时间(以毫秒为单位) |
|
在检查点处理部分(将文件同步到磁盘)中花费的总时间(以毫秒为单位) |
|
检查点期间写入的缓冲区数量 |
|
后台写入程序写入的缓冲区数量 |
|
后台写入程序因写入缓冲区过多而停止清理扫描的次数 |
|
后台直接写入的缓冲区数量 |
|
后台必须执行其自己的 |
|
已分配的缓冲区数量 |
|
上次重置这些统计信息的时间 |
pg_stat_wal #pg_stat_wal 视图始终只有一行,其中包含集群 WAL 活动的数据。
表 28.25. pg_stat_wal 视图
|
列类型 说明 |
|---|
|
生成的 WAL 记录总数 |
|
已生成的 WAL 全页映像总数 |
|
以字节为单位生成的 WAL 总量 |
|
由于 WAL 缓冲区已满,将 WAL 数据写入磁盘的次数 |
|
通过 |
|
通过 |
|
通过 |
|
通过 |
|
上次重置这些统计信息的时间 |
pg_stat_database #pg_stat_database 视图将包含集群中每个数据库的一行,以及共享对象的一行,显示数据库范围的统计信息。
表 28.26.pg_stat_database 视图
|
列类型 说明 |
|---|
|
此数据库的 OID,或属于共享关系的对象的 0 |
|
此数据库的名称,或共享对象的 |
|
当前连接到此数据库的后端数,或共享对象的 |
|
此数据库中已提交的事务数 |
|
此数据库中已回滚的事务数 |
|
此数据库中读取的磁盘块数 |
|
磁盘块已在缓冲区高速缓存中找到的次数,因此无需读取(这仅包括 PostgreSQL 缓冲区高速缓存中的命中,不包括操作系统文件系统高速缓存中的命中) |
|
此数据库中顺序扫描获取的活动行数和索引扫描返回的索引条目数 |
|
此数据库中索引扫描获取的活动行数 |
|
此数据库中查询插入的行数 |
|
此数据库中查询更新的行数 |
|
此数据库中查询删除的行数 |
|
此数据库中因与恢复冲突而取消的查询数。(冲突仅发生在备用服务器上;有关详细信息,请参见 |
|
此数据库中查询创建的临时文件数。无论临时文件为何创建(例如,排序或哈希),以及 log_temp_files 设置如何,所有临时文件都将被计算在内。 |
|
此数据库中查询写入临时文件的数据总量。所有临时文件都会计算在内,无论临时文件为何创建,也无论 log_temp_files 设置如何。 |
|
此数据库中检测到的死锁数 |
|
此数据库(或共享对象上)检测到的数据页校验和失败数,如果未启用数据校验和,则为 NULL。 |
|
此数据库(或共享对象上)检测到最后一次数据页校验和失败的时间,如果未启用数据校验和,则为 NULL。 |
|
此数据库中后端读取数据文件块所花费的时间(以毫秒为单位)(如果启用了 track_io_timing,否则为零) |
|
此数据库中后端写入数据文件块所花费的时间(以毫秒为单位)(如果启用了 track_io_timing,否则为零) |
|
此数据库中数据库会话所花费的时间(以毫秒为单位)(请注意,仅在会话状态更改时才会更新统计信息,因此如果会话长时间处于空闲状态,则不会包括此空闲时间) |
|
此数据库中执行 SQL 语句所花费的时间(以毫秒为单位)(这对应于 |
|
此数据库中在事务中空闲时所花费的时间(以毫秒为单位)(这对应于 |
|
与此数据库建立的会话总数 |
|
由于与客户端的连接丢失而终止的与此数据库的数据库会话数 |
|
由于致命错误而终止的与此数据库的数据库会话数 |
|
由操作员干预而终止的此数据库的数据库会话数 |
|
上次重置这些统计信息的时间 |
pg_stat_database_conflicts #视图 pg_stat_database_conflicts 将包含每个数据库的一行,显示由于与备用服务器上的恢复冲突而发生的查询取消的数据库范围统计信息。此视图将仅包含备用服务器上的信息,因为冲突不会在主服务器上发生。
表 28.27. pg_stat_database_conflicts 视图
|
列类型 说明 |
|---|
|
数据库的 OID |
|
此数据库的名称 |
|
由于删除表空间而取消的此数据库中的查询数 |
|
由于锁超时而取消的此数据库中的查询数 |
|
由于旧快照而取消的此数据库中的查询数 |
|
由于固定缓冲区而取消的此数据库中的查询数 |
|
由于死锁而取消的此数据库中的查询数 |
|
由于旧快照或主服务器上的 wal_level 过低而取消的此数据库中逻辑槽的使用数 |
pg_stat_all_tables #视图 pg_stat_all_tables 将包含当前数据库中每个表的一行(包括 TOAST 表),显示对该特定表的访问统计信息。视图 pg_stat_user_tables 和 pg_stat_sys_tables 包含相同的信息,但经过筛选,分别仅显示用户表和系统表。
表 28.28. pg_stat_all_tables 视图
|
列类型 说明 |
|---|
|
表的 OID |
|
此表所在的模式的名称 |
|
此表的名称 |
|
此表上启动的顺序扫描数 |
|
此表上最后一次顺序扫描的时间,基于最近的事务停止时间 |
|
顺序扫描获取的活动行数 |
|
此表上启动的索引扫描数 |
|
此表上最后一次索引扫描的时间,基于最近的事务停止时间 |
|
索引扫描获取的活动行数 |
|
插入的总行数 |
|
更新的总行数。(这包括 |
|
删除的总行数 |
|
以 HOT 更新的行数。这些更新在索引中不需要后续版本。 |
|
更新的行数,其中后续版本转到一个 新的 堆页,留下一个原始版本,其中 |
|
活动行的估计数 |
|
死行的估计数 |
|
自上次分析此表以来修改的行数估计 |
|
自上次对该表进行 vacuum 操作以来插入的行数估计 |
|
上次手动对该表进行 vacuum 操作的时间(不包括 |
|
上次由 autovacuum 守护进程对该表进行 vacuum 操作的时间 |
|
上次手动分析此表的时刻 |
|
上次由自动清理守护进程分析此表的时刻 |
|
手动清理此表的次数(不包括 |
|
自动清理守护进程清理此表的次数 |
|
手动分析此表的次数 |
|
自动清理守护进程分析此表的次数 |
pg_stat_all_indexes #对于当前数据库中的每个索引,pg_stat_all_indexes 视图将包含一行,显示有关对该特定索引的访问的统计信息。 pg_stat_user_indexes 和 pg_stat_sys_indexes 视图包含相同的信息,但经过筛选,分别只显示用户索引和系统索引。
表 28.29. pg_stat_all_indexes 视图
|
列类型 说明 |
|---|
|
此索引所属表的 OID |
|
此索引的 OID |
|
此索引所在的架构的名称 |
|
此索引所属表的名称 |
|
此索引的名称 |
|
在此索引上启动的索引扫描次数 |
|
此索引上的上次扫描时间,基于最近的事务停止时间 |
|
此索引上的扫描返回的索引条目数 |
|
使用此索引的简单索引扫描获取的活动表行数 |
索引可用于简单索引扫描、““位图””索引扫描和优化器。在位图扫描中,可以通过 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 计数从表中获取的活动行。如果使用索引获取任何已删除或尚未提交的行,或者通过仅索引扫描避免任何堆获取,则后者将更少。
pg_statio_all_tables #pg_statio_all_tables 视图将包含当前数据库中每个表(包括 TOAST 表)的一行,显示有关该特定表上 I/O 的统计信息。pg_statio_user_tables 和 pg_statio_sys_tables 视图包含相同的信息,但经过筛选,分别只显示用户表和系统表。
表 28.30. pg_statio_all_tables 视图
|
列类型 说明 |
|---|
|
表的 OID |
|
此表所在的模式的名称 |
|
此表的名称 |
|
从该表读取的磁盘块数 |
|
该表中的缓冲区命中数 |
|
从该表的所有索引读取的磁盘块数 |
|
该表所有索引中的缓冲区命中数 |
|
从该表的 TOAST 表(如果有)读取的磁盘块数 |
|
该表的 TOAST 表(如果有)中的缓冲区命中数 |
|
从该表的 TOAST 表索引(如果有)读取的磁盘块数 |
|
该表的 TOAST 表索引(如果有)中的缓冲区命中数 |
pg_statio_all_indexes #pg_statio_all_indexes 视图将包含当前数据库中每个索引的一行,显示有关该特定索引上 I/O 的统计信息。pg_statio_user_indexes 和 pg_statio_sys_indexes 视图包含相同的信息,但经过筛选,分别只显示用户索引和系统索引。
表 28.31.pg_statio_all_indexes 视图
|
列类型 说明 |
|---|
|
此索引所属表的 OID |
|
此索引的 OID |
|
此索引所在的架构的名称 |
|
此索引所属表的名称 |
|
此索引的名称 |
|
从该索引读取的磁盘块数 |
|
该索引中的缓冲区命中数 |
pg_statio_all_sequences #pg_statio_all_sequences 视图将包含当前数据库中每个序列的一行,显示有关该特定序列上的 I/O 的统计信息。
表 28.32.pg_statio_all_sequences 视图
|
列类型 说明 |
|---|
|
序列的 OID |
|
此序列所在的模式的名称 |
|
此序列的名称 |
|
从该序列读取的磁盘块数 |
|
该序列中的缓冲区命中数 |
pg_stat_user_functions #pg_stat_user_functions 视图将包含每个跟踪函数的一行,显示有关该函数执行的统计信息。track_functions 参数精确控制跟踪哪些函数。
表 28.33.pg_stat_user_functions 视图
|
列类型 说明 |
|---|
|
函数的 OID |
|
此函数所在的模式的名称 |
|
此函数的名称 |
|
此函数被调用的次数 |
|
在此函数和它调用的所有其他函数中花费的总时间(以毫秒为单位) |
|
在此函数本身花费的总时间(不包括它调用的其他函数),以毫秒为单位 |
pg_stat_slru #PostgreSQL 通过SLRU(简单最近最少使用)缓存访问某些磁盘信息。pg_stat_slru 视图将包含每个跟踪的 SLRU 缓存的一行,显示有关对缓存页面访问的统计信息。
表 28.34.pg_stat_slru 视图
|
列类型 说明 |
|---|
|
SLRU 的名称 |
|
初始化期间清零的块数 |
|
在 SLRU 中找到磁盘块的次数,因此无需读取(这仅包括 SLRU 中的命中,不包括操作系统文件系统缓存) |
|
为该 SLRU 读取的磁盘块数 |
|
为该 SLRU 写入的磁盘块数 |
|
为该 SLRU 检查存在的块数 |
|
为该 SLRU 刷新脏数据的次数 |
|
为该 SLRU 截断的次数 |
|
上次重置这些统计信息的时间 |
可以通过编写使用与上面显示的标准视图所使用的相同底层统计信息访问函数的查询来设置查看统计信息的其他方式。有关函数名称等详细信息,请参阅标准视图的定义。(例如,在 psql 中,您可以发出 \d+ pg_stat_activity。)用于每个数据库统计信息的访问函数将数据库 OID 作为参数,以识别要报告的数据库。每个表和每个索引函数将表或索引 OID 作为参数。用于每个函数统计信息的函数将函数 OID 作为参数。请注意,只能使用这些函数查看当前数据库中的表、索引和函数。
与累积统计信息系统相关的其他函数列在 表 28.35 中。
表 28.35. 其他统计信息函数
使用 pg_stat_reset() 还会重置自动清理用来确定何时触发清理或分析的计数器。重置这些计数器可能导致自动清理无法执行必要的工作,从而导致表膨胀或表统计信息过时等问题。建议在重置统计信息后对整个数据库执行 ANALYZE。
pg_stat_get_activity,pg_stat_activity 视图的基础函数,返回一组包含每个后端进程所有可用信息的记录。有时,获取此信息的子集可能更方便。在这种情况下,可以使用另一组按后端统计访问函数;这些函数显示在 表 28.36 中。这些访问函数使用会话的后端 ID 号,这是一个与任何并发会话的后端 ID 不同的较小的正整数,尽管会话的 ID 可以在退出后立即回收。后端 ID 用于识别会话的临时架构(如果有)。函数 pg_stat_get_backend_idset 提供了一种方便的方法来列出所有活动后端的 ID 号,以便调用这些函数。例如,要显示所有后端的 PID 和当前查询
SELECT pg_stat_get_backend_pid(backendid) AS pid,
pg_stat_get_backend_activity(backendid) AS query
FROM pg_stat_get_backend_idset() AS backendid;
表 28.36。按后端统计函数
|
函数 说明 |
|---|
|
返回此后端最近查询的文本。 |
|
返回后端最近查询的启动时间。 |
|
返回连接到此后端的客户端的 IP 地址。 |
|
返回客户端用于通信的 TCP 端口号。 |
|
返回此后端连接到的数据库的 OID。 |
|
返回当前活动的后端 ID 号集。 |
|
返回此后端的进程 ID。 |
|
返回此进程启动的时间。 |
|
返回有关指定 ID 后端子事务的信息记录。返回的字段为 |
|
返回登录到此后端的用户的 OID。 |
|
如果此后端当前正在等待,则返回等待事件类型名称,否则返回 NULL。有关详细信息,请参见 表 28.4。 |
|
返回后端当前事务启动的时间。 |
如果您在文档中看到任何不正确、与您对特定功能的体验不符或需要进一步澄清的内容,请使用 此表单 报告文档问题。