2025年9月25日: PostgreSQL 18 发布!
支持的版本: 当前 (18) / 17 / 16 / 15 / 14 / 13
开发版本: devel
不支持的版本: 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

27.2. 累积统计信息系统 #

PostgreSQL累积统计信息系统 支持收集和报告服务器活动信息。目前,它会计算表和索引的磁盘块访问次数和单个行访问次数。每个表的总行数,以及每个表的 vacuum 和 analyze 操作的信息也会被计算。如果启用,用户定义函数的调用次数以及在每个函数中花费的总时间也会被计算。

PostgreSQL 还支持报告系统当前活动的动态信息,例如其他服务器进程当前正在执行的确切命令,以及系统中存在的其他连接。此功能独立于累积统计信息系统。

27.2.1. 统计信息收集配置 #

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

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

参数 track_cost_delay_timing 启用对基于成本的 vacuum 延迟的监控。

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

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

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

参数 track_wal_io_timing 启用对 WAL 读取、写入和 fsync 时间的监控。

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

累积统计信息收集在共享内存中。每个 PostgreSQL 进程在本地收集统计信息,然后在适当的间隔更新共享数据。当服务器(包括物理副本)正常关闭时,统计信息数据的永久副本将存储在 pg_stat 子目录中,以便在服务器重启后保留统计信息。相比之下,当从非正常关闭(例如,即时关闭、服务器崩溃、从基础备份启动以及时间点恢复)启动时,所有统计计数器都会重置。

27.2.2. 查看统计信息 #

有几个预定义的视图,列在 表 27.1 中,可用于显示系统的当前状态。还有其他几个视图,列在 表 27.2 中,可用于显示累积的统计信息。或者,可以使用基础的累积统计函数构建自定义视图,如 27.2.26 统计函数 中所述。

在使用累积统计信息视图和函数监控收集的数据时,重要的是要认识到信息并非瞬时更新。每个独立的服务器进程在进入空闲状态之前会将累积的统计信息刷新到共享内存,但频率不超过每 PGSTAT_MIN_INTERVAL 毫秒(默认为 1 秒,除非在构建服务器时进行了更改);因此,仍在进行的查询或事务不会影响显示的总体数量,并且显示的信息会滞后于实际活动。但是,由 track_activities 收集的当前查询信息始终是最新的。

另一个重要的点是,当服务器进程被要求显示任何累积的统计信息时,在默认配置下,访问的值会被缓存直到其当前事务结束。因此,只要你继续当前事务,统计信息就会显示静态信息。同样,所有会话的当前查询信息会在事务内第一次被请求时收集,并且在整个事务期间会显示相同的信息。这是一个特性,而不是 bug,因为它允许你对统计信息进行多次查询并关联结果,而无需担心数字在你眼前变化。在交互式地或使用昂贵的查询分析统计信息时,访问各个统计信息之间的时间差可能导致缓存的统计信息产生显著的偏差。为了最小化偏差,可以将 stats_fetch_consistency 设置为 snapshot,但代价是增加了缓存不需要的统计信息数据的内存使用量。反之,如果已知统计信息只使用一次,则可以通过将 stats_fetch_consistency 设置为 none 来避免缓存访问的统计信息。你可以调用 pg_stat_clear_snapshot() 来丢弃当前事务的统计信息快照或缓存值(如果有)。统计信息的下一次使用(在快照模式下)将导致构建新快照,或(在缓存模式下)访问缓存的统计信息。

事务还可以看到其自身的统计信息(尚未刷新到共享内存统计信息)在视图 pg_stat_xact_all_tablespg_stat_xact_sys_tablespg_stat_xact_user_tablespg_stat_xact_user_functions 中。这些数字不像上面描述的那样工作;相反,它们在整个事务过程中持续更新。

表 27.1 中显示的动态统计信息视图中的某些信息是安全受限的。普通用户只能看到关于他们自己的会话(属于他们是成员的角色)的所有信息。在关于其他会话的行中,许多列将为 NULL。但是,请注意,所有用户都可以看到会话的存在及其一般属性,例如其会话用户和数据库。超级用户和具有内置角色 pg_read_all_stats 权限的角色可以查看关于所有会话的所有信息。

表 27.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 的后端(包括 autovacuum 工作进程)一行,显示当前进度。请参阅 27.4.1 ANALYZE 进度报告
pg_stat_progress_create_index 每个正在运行 CREATE INDEXREINDEX 的后端一行,显示当前进度。请参阅 27.4.4 CREATE INDEX 进度报告
pg_stat_progress_vacuum 每个正在运行 VACUUM 的后端(包括 autovacuum 工作进程)一行,显示当前进度。请参阅 27.4.5 VACUUM 进度报告
pg_stat_progress_cluster 每个正在运行 CLUSTERVACUUM FULL 的后端一行,显示当前进度。请参阅 27.4.2 CLUSTER 进度报告
pg_stat_progress_basebackup 每个正在流式传输基础备份的 WAL 发送进程一行,显示当前进度。请参阅 27.4.6 Base Backup 进度报告
pg_stat_progress_copy 每个正在运行 COPY 的后端一行,显示当前进度。请参阅 27.4.3 COPY 进度报告

表 27.2. 收集的统计信息视图

视图名称 描述
pg_stat_archiver 只有一行,显示有关 WAL 归档进程活动的信息。有关详细信息,请参阅 pg_stat_archiver
pg_stat_bgwriter 只有一行,显示有关后台写入进程活动的信息。有关详细信息,请参阅 pg_stat_bgwriter
pg_stat_checkpointer 只有一行,显示有关检查点进程活动的信息。有关详细信息,请参阅 pg_stat_checkpointer
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 和 analyze 操作的列。
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_iopg_statio_ 系列视图对于确定缓冲区缓存的有效性很有用。它们可以用于计算缓存命中率。请注意,虽然 PostgreSQL 的 I/O 统计信息捕获了大多数内核被调用以执行 I/O 的情况,但它们并未区分必须从磁盘读取的数据和已存在于内核页面缓存中的数据。建议用户将 PostgreSQL 统计信息视图与操作系统实用程序结合使用,以更全面地了解其数据库的 I/O 性能。

27.2.3. pg_stat_activity #

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

表 27.3. pg_stat_activity 视图

列 类型

描述

datid oid

此后端连接到的数据库的 OID

datname name

此后端连接到的数据库的名称

pid integer

此后端的进程 ID

leader_pid integer

如果此进程是并行查询工作进程,则为并行组领导者的进程 ID;如果是并行应用工作进程,则为并行应用领导者的进程 ID。NULL 表示此进程是并行组领导者或领导者应用工作进程,或不参与任何并行操作。

usesysid oid

登录到此后端的用户的 OID

usename name

登录到此后端的用户的名称

application_name text

连接到此后端的应用程序的名称

client_addr inet

连接到此后端的客户端的 IP 地址。如果此字段为 NULL,则表示客户端通过服务器上的 Unix 套接字连接,或者这是一个内部进程(例如 autovacuum)。

client_hostname text

连接客户端的主机名,由 client_addr 的反向 DNS 查询报告。此字段仅对 IP 连接非 NULL,并且仅当 log_hostname 启用时才有效。

client_port integer

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

backend_start timestamp with time zone

此进程启动的时间。对于客户端后端,这是客户端连接到服务器的时间。

xact_start timestamp with time zone

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

query_start timestamp with time zone

当前活动查询启动的时间,或者如果 state 不是 active,则为最后一个查询启动的时间

state_change timestamp with time zone

state 上次更改的时间

wait_event_type text

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

wait_event text

如果后端当前正在等待,则为等待事件名称,否则为 NULL。请参阅 表 27.5表 27.13

state text

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

  • starting:后端处于初始启动状态。在此阶段执行客户端身份验证。

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

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

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

  • idle in transaction (aborted):此状态类似于 idle in transaction,不同之处在于事务中的一个语句导致了错误。

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

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

backend_xid xid

此后端的顶层事务标识符(如果有);请参阅 67.1 事务和标识符

backend_xmin xid

当前后端的 xmin 视界。

query_id bigint

此后端最近一次查询的标识符。如果 stateactive,则此字段显示当前执行查询的标识符。在所有其他状态下,它显示最后执行的查询的标识符。默认情况下不计算查询标识符,因此除非启用了 compute_query_id 参数或配置了第三方模块来计算查询标识符,否则此字段将为 NULL。

query text

此后端最近一次查询的文本。如果 stateactive,则此字段显示当前执行的查询。在所有其他状态下,它显示最后执行的查询。默认情况下,查询文本会截断为 1024 字节;此值可以通过参数 track_activity_query_size 进行更改。

backend_type text

当前后端的类型。可能的类型包括 autovacuum launcherautovacuum workerlogical replication launcherlogical replication workerparallel workerbackground writerclient backendcheckpointerarchiverstandalone backendstartupwalreceiverwalsenderwalwriterwalsummarizer。此外,由扩展程序注册的后台工作进程可能具有其他类型。


注意

wait_eventstate 列是独立的。如果后端处于 active 状态,它可能正在等待某个事件,也可能没有。如果状态为 activewait_event 非 NULL,则表示正在执行查询,但该查询在系统中被阻塞了。为了降低报告开销,系统不会尝试同步后端活动数据的不同方面。因此,视图的列之间可能存在短暂的差异。

表 27.4. 等待事件类型

等待事件类型 描述
Activity 服务器进程空闲。此事件类型指示进程在其主处理循环中等待活动。wait_event 将标识具体的等待点;请参阅 表 27.5
BufferPin 服务器进程正在等待对数据缓冲区的独占访问。如果另一个进程持有对所讨论缓冲区的最后一次读取数据的游标,则缓冲区 pin 等待可能会很长。请参阅 表 27.6
Client 服务器进程正在等待用户应用程序连接的套接字上的活动。因此,服务器期望发生一些独立于其内部进程的事件。wait_event 将标识具体的等待点;请参阅 表 27.7
Extension 服务器进程正在等待由扩展模块定义的某个条件。请参阅 表 27.8
InjectionPoint 服务器进程正在等待注入点达到测试中定义的某个结果。有关更多详细信息,请参阅 36.10.14 注入点。此类型没有预定义的等待点。
IO 服务器进程正在等待 I/O 操作完成。wait_event 将标识具体的等待点;请参阅 表 27.9
IPC 服务器进程正在等待与其他服务器进程的某种交互。wait_event 将标识具体的等待点;请参阅 表 27.10
Lock 服务器进程正在等待一个重量级锁。重量级锁,也称为锁管理器锁或简称为锁,主要保护 SQL 可见的对象(如表)。然而,它们也用于确保某些内部操作(如关系扩展)的互斥。wait_event 将标识所等待的锁的类型;请参阅 表 27.11
LWLock 服务器进程正在等待一个轻量级锁。大多数此类锁保护共享内存中的特定数据结构。wait_event 将包含一个标识轻量级锁用途的名称。(有些锁有特定名称;有些是具有类似用途的锁组的一部分。)请参阅 表 27.12
Timeout 服务器进程正在等待一个超时过期。wait_event 将标识具体的等待点;请参阅 表 27.13

表 27.5. 类型为 Activity 的等待事件

Activity 等待事件 描述
ArchiverMain 归档进程主循环等待。
AutovacuumMain 自动 vacuum 启动器进程主循环等待。
BgwriterHibernate 后台写入进程休眠等待。
BgwriterMain 后台写入进程主循环等待。
CheckpointerMain 检查点进程主循环等待。
CheckpointerShutdown 等待检查点进程终止。
IoWorkerMain IO 工作进程主循环等待。
LogicalApplyMain 逻辑复制应用进程主循环等待。
LogicalLauncherMain 逻辑复制启动器进程主循环等待。
LogicalParallelApplyMain 逻辑复制并行应用进程主循环等待。
RecoveryWalStream 在流式恢复期间,启动进程等待 WAL 到达。
ReplicationSlotsyncMain 槽同步工作进程主循环等待。
ReplicationSlotsyncShutdown 等待槽同步工作进程关闭。
SysloggerMain 日志记录进程主循环等待。
WalReceiverMain WAL 接收器进程主循环等待。
WalSenderMain WAL 发送器进程主循环等待。
WalSummarizerWal WAL 摘要程序等待更多 WAL 的生成。
WalWriterMain WAL 写入器进程主循环等待。

表 27.6. 类型为 Bufferpin 的等待事件

BufferPin 等待事件 描述
BufferPin 等待获取缓冲区的独占 pin。

表 27.7. 类型为 Client 的等待事件

Client 等待事件 描述
ClientRead 等待从客户端读取数据。
ClientWrite 等待向客户端写入数据。
GssOpenServer 在建立 GSSAPI 会话时,等待从客户端读取数据。
LibpqwalreceiverConnect WAL 接收器等待与远程服务器建立连接。
LibpqwalreceiverReceive WAL 接收器等待从远程服务器接收数据。
SslOpenServer 尝试连接时等待 SSL。
WaitForStandbyConfirmation 等待 WAL 被物理备用服务器接收和刷新。
WalSenderWaitForWal WAL 发送器进程等待 WAL 被刷新。
WalSenderWriteData 在 WAL 发送器进程中处理来自 WAL 接收器回复时,等待任何活动。

表 27.8. 类型为 Extension 的等待事件

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

表 27.9. 类型为 Io 的等待事件

IO 等待事件 描述
AioIoCompletion 等待另一个进程完成 IO。
AioIoUringExecution 通过 io_uring 等待 IO 执行。
AioIoUringSubmit 通过 io_uring 等待 IO 提交。
BasebackupRead 等待基础备份从文件读取。
BasebackupSync 等待基础备份写入的数据到达持久存储。
BasebackupWrite 等待基础备份写入文件。
BuffileRead 等待从缓冲文件中读取。
BuffileTruncate 等待截断缓冲文件。
BuffileWrite 等待写入缓冲文件。
ControlFileRead 等待从 pg_control 文件读取。
ControlFileSync 等待 pg_control 文件到达持久存储。
ControlFileSyncUpdate 等待 pg_control 文件更新到达持久存储。
ControlFileWrite 等待写入 pg_control 文件。
ControlFileWriteUpdate 等待写入更新 pg_control 文件。
CopyFileCopy 等待文件复制操作。
CopyFileRead 在文件复制操作期间等待读取。
CopyFileWrite 在文件复制操作期间等待写入。
DataFileExtend 等待关系数据文件扩展。
DataFileFlush 等待关系数据文件到达持久存储。
DataFileImmediateSync 等待关系数据文件立即同步到持久存储。
DataFilePrefetch 等待从关系数据文件进行异步预取。
DataFileRead 等待从关系数据文件读取。
DataFileSync 等待关系数据文件的更改到达持久存储。
DataFileTruncate 等待关系数据文件被截断。
DataFileWrite 等待写入关系数据文件。
DsmAllocate 等待动态共享内存段被分配。
DsmFillZeroWrite 等待用零填充动态共享内存的后备文件。
LockFileAddtodatadirRead 在向数据目录锁定文件添加行时等待读取。
LockFileAddtodatadirSync 在向数据目录锁定文件添加行时,等待数据到达持久存储。
LockFileAddtodatadirWrite 在向数据目录锁定文件添加行时等待写入。
LockFileCreateRead 在创建数据目录锁定文件时等待读取。
LockFileCreateSync 在创建数据目录锁定文件时,等待数据到达持久存储。
LockFileCreateWrite 在创建数据目录锁定文件时等待写入。
LockFileRecheckdatadirRead 在重新检查数据目录锁定文件时等待读取。
LogicalRewriteCheckpointSync 等待逻辑重写映射在检查点期间到达持久存储。
LogicalRewriteMappingSync 等待映射数据在逻辑重写期间到达持久存储。
LogicalRewriteMappingWrite 等待在逻辑重写期间写入映射数据。
LogicalRewriteSync 等待逻辑重写映射到达持久存储。
LogicalRewriteTruncate 等待在逻辑重写期间截断映射数据。
LogicalRewriteWrite 等待写入逻辑重写映射。
RelationMapRead 等待从关系映射文件读取。
RelationMapReplace 等待关系映射文件的持久替换。
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 等待写入两阶段状态文件。
VersionFileSync 在创建数据库时,等待版本文件到达持久存储。
VersionFileWrite 在创建数据库时,等待写入版本文件。
WalsenderTimelineHistoryRead 在 WAL 发送器时间线命令期间,等待从时间线历史文件读取。
WalBootstrapSync 在引导期间,等待 WAL 到达持久存储。
WalBootstrapWrite 在引导期间,等待写入 WAL 页面。
WalCopyRead 在通过复制现有 WAL 段来创建新的 WAL 段时等待读取。
WalCopySync 在通过复制现有 WAL 段创建新的 WAL 段时,等待其到达持久存储。
WalCopyWrite 在通过复制现有 WAL 段来创建新的 WAL 段时等待写入。
WalInitSync 等待新初始化的 WAL 文件到达持久存储。
WalInitWrite 在初始化新 WAL 文件时等待写入。
WalRead 等待从 WAL 文件读取。
WalSummaryRead 等待从 WAL 摘要文件读取。
WalSummaryWrite 等待写入 WAL 摘要文件。
WalSync 等待 WAL 文件到达持久存储。
WalSyncMethodAssign 在分配新的 WAL 同步方法时,等待数据到达持久存储。
WalWrite 等待写入 WAL 文件。

表 27.10. 类型为 Ipc 的等待事件

IPC 等待事件 描述
AppendReady 等待 Append 计划节点的子节点准备就绪。
ArchiveCleanupCommand 等待 archive_cleanup_command 完成。
ArchiveCommand 等待 archive_command 完成。
BackendTermination 等待另一个后端的终止。
BackupWaitWalArchive 等待备份所需的 WAL 文件成功归档。
BgworkerShutdown 等待后台工作进程关闭。
BgworkerStartup 等待后台工作进程启动。
BtreePage 等待继续并行 B-tree 扫描所需的页面编号可用。
BufferIo 等待缓冲区 I/O 完成。
CheckpointDelayComplete 等待阻止检查点完成的后端。
CheckpointDelayStart 等待阻止检查点启动的后端。
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 等待将字节发送到共享消息队列。
MultixactCreation 等待多事务创建完成。
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 等待启动进程发送流式复制的初始数据。
WalSummaryReady 等待生成新的 WAL 摘要。
XactGroupUpdate 等待组领导者在事务结束时更新事务状态。

表 27.11. 类型为 Lock 的等待事件

Lock 等待事件 描述
advisory 等待获取咨询用户锁。
applytransaction 等待获取由逻辑复制订阅者应用的远程事务的锁。
extend 等待扩展关系。
frozenid 等待更新 pg_database.datfrozenxidpg_database.datminmxid
object 等待获取非关系数据库对象的锁。
page 等待获取关系的页面的锁。
relation 等待获取关系的锁。
spectoken 等待获取推测性插入锁。
transactionid 等待事务完成。
tuple 等待获取元组的锁。
userlock 等待获取用户锁。
virtualxid 等待获取虚拟事务 ID 锁;请参阅 67.1 事务和标识符

表 27.12. 类型为 Lwlock 的等待事件

LWLock 等待事件 描述
AddinShmemInit 等待管理扩展在共享内存中的空间分配。
AioUringCompletion 通过 io_uring 等待另一个进程完成 IO。
AioWorkerSubmissionQueue 等待访问 AIO 工作进程提交队列。
AutoFile 等待更新 postgresql.auto.conf 文件。
Autovacuum 等待读取或更新自动 vacuum 工作进程的当前状态。
AutovacuumSchedule 等待确保已选择要进行自动 vacuum 的表仍然需要 vacuum。
BackgroundWorker 等待读取或更新后台工作进程状态。
BtreeVacuum 等待读取或更新 B-tree 索引的 vacuum 相关信息。
BufferContent 等待访问内存中的数据页面。
BufferMapping 等待将数据块与缓冲区池中的缓冲区关联。
CheckpointerComm 等待管理 fsync 请求。
CommitTs 等待读取或更新事务提交时间戳设置的最后一个值。
CommitTsBuffer 等待提交时间戳 SLRU 缓冲区的 I/O。
CommitTsSLRU 等待访问提交时间戳 SLRU 缓存。
ControlFile 等待读取或更新 pg_control 文件或创建新的 WAL 文件。
DSMRegistry 等待读取或更新动态共享内存注册表。
DSMRegistryDSA 等待访问动态共享内存注册表的动态共享内存分配器。
DSMRegistryHash 等待访问动态共享内存注册表的共享哈希表。
DynamicSharedMemoryControl 等待读取或更新动态共享内存分配信息。
InjectionPoint 等待读取或更新与注入点相关的信息。
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。
ParallelAppend 在并行 Append 计划执行期间,等待选择下一个子计划。
ParallelBtreeScan 等待并行 B-tree 扫描计划执行期间同步工作进程。
ParallelHashJoin 等待并行哈希连接计划执行期间同步工作进程。
ParallelQueryDSA 等待并行查询动态共享内存分配。
ParallelVacuumDSA 等待并行 vacuum 动态共享内存分配。
PerSessionDSA 等待并行查询动态共享内存分配。
PerSessionRecordType 等待访问并行查询关于复合类型的信息。
PerSessionRecordTypmod 等待访问并行查询关于修饰符(标识匿名记录类型)的信息。
PerXactPredicateList 在并行查询期间,等待访问当前可串行化事务持有的谓词锁列表。
PgStatsData 等待共享内存统计数据访问。
PgStatsDSA 等待统计信息动态共享内存分配器访问。
PgStatsHash 等待统计信息共享内存哈希表访问。
PredicateLockManager 等待访问由可串行化事务使用的谓词锁信息。
ProcArray 等待访问共享的每个进程数据结构(通常是为了获取快照或报告会话的事务 ID)。
RelationMapping 等待读取或更新 pg_filenode.map 文件(用于跟踪某些系统目录的 filenode 分配)。
RelCacheInit 等待读取或更新 pg_internal.init 关系缓存初始化文件。
ReplicationOrigin 等待创建、删除或使用复制源。
ReplicationOriginState 等待读取或更新一个复制源的进度。
ReplicationSlotAllocation 等待分配或释放复制槽。
ReplicationSlotControl 等待读取或更新复制槽状态。
ReplicationSlotIO 等待复制槽的 I/O。
SerialBuffer 等待可串行化事务冲突 SLRU 缓冲区的 I/O。
SerialControl 等待读取或更新共享 pg_serial 状态。
SerializableFinishedList 等待访问已完成的可串行化事务列表。
SerializablePredicateList 等待访问可串行化事务持有的谓词锁列表。
SerializableXactHash 等待读取或更新关于可串行化事务的信息。
SerialSLRU 等待访问可串行化事务冲突 SLRU 缓存。
SharedTidBitmap 在并行位图索引扫描期间,等待访问共享 TID 位图。
SharedTupleStore 在并行查询期间,等待访问共享元组存储。
ShmemIndex 等待在共享内存中查找或分配空间。
SInvalRead 等待从共享目录无效队列中检索消息。
SInvalWrite 等待将消息添加到共享目录无效队列。
SubtransBuffer 等待子事务 SLRU 缓冲区的 I/O。
SubtransSLRU 等待访问子事务 SLRU 缓存。
SyncRep 等待读取或更新同步复制状态的信息。
SyncScan 等待选择同步表扫描的起始位置。
TablespaceCreate 等待创建或删除表空间。
TwoPhaseState 等待读取或更新已准备事务的状态。
WaitEventCustom 等待读取或更新自定义等待事件信息。
WALBufMapping 等待替换 WAL 缓冲区中的页面。
WALInsert 等待将 WAL 数据插入内存缓冲区。
WALSummarizer 等待读取或更新 WAL 摘要状态。
WALWrite 等待将 WAL 缓冲区写入磁盘。
WrapLimitsVacuum 等待更新事务 ID 和多事务消耗的限制。
XactBuffer 等待事务状态 SLRU 缓冲区的 I/O。
XactSLRU 正在等待访问事务状态 SLRU 缓存。
XactTruncation 正在等待执行 pg_xact_status 或更新可用于它的最旧事务 ID。
XidGen 正在等待分配新的事务 ID。

表 27.13. Timeout 类型的等待事件

Timeout 等待事件 描述
BaseBackupThrottle 在基线备份期间,当限制活动时等待。
CheckpointWriteDelay 在执行检查点期间,写入之间等待。
PgSleep 由于调用 pg_sleep 或其同级函数而等待。
RecoveryApplyDelay 由于延迟设置,在恢复期间等待应用 WAL。
RecoveryRetrieveRetryInterval 在恢复期间,当 WAL 数据无法从任何源 (pg_wal、归档或流) 获取时等待。
RegisterSyncRequest 由于请求队列已满,在发送同步请求到检查点进程时等待。
SpinDelay 在获取争用中的自旋锁时等待。
VacuumDelay 在基于成本的 VACUUM 延迟点等待。
VacuumTruncate 等待获取排他锁以截断在表 VACUUM 完成后留下的任何空页面。
WalSummarizerError 在 WAL 摘要器错误后等待。

以下是查看等待事件的示例

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)
SELECT a.pid, a.wait_event, w.description
  FROM pg_stat_activity a JOIN
       pg_wait_events w ON (a.wait_event_type = w.type AND
                            a.wait_event = w.name)
  WHERE a.wait_event is NOT NULL and a.state = 'active';
-[ RECORD 1 ]------------------------------------------------------​------------
pid         | 686674
wait_event  | WALInitSync
description | Waiting for a newly initialized WAL file to reach durable storage

注意

扩展可以向 表 27.8表 27.12 中显示的列表添加 ExtensionInjectionPointLWLock 事件。在某些情况下,扩展分配的 LWLock 的名称可能并非在所有服务器进程中都可用。它可能仅报告为“extension”,而不是扩展分配的名称。

27.2.4. pg_stat_replication #

视图 pg_stat_replication 将包含每个 WAL 发送进程一行,显示关于复制到该发送器连接的备用服务器的统计信息。仅列出直接连接的备用服务器;关于下游备用服务器的信息不可用。

表 27.14. pg_stat_replication 视图

列 类型

描述

pid integer

WAL 发送进程的进程 ID

usesysid oid

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

usename name

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

application_name text

连接到此 WAL 发送器的应用程序名称

client_addr inet

连接到此 WAL 发送器的客户端的 IP 地址。如果此字段为 NULL,则表示客户端通过服务器上的 Unix 套接字连接。

client_hostname text

连接客户端的主机名,由 client_addr 的反向 DNS 查询报告。此字段仅对 IP 连接非 NULL,并且仅当 log_hostname 启用时才有效。

client_port integer

客户端用于与此 WAL 发送器通信的 TCP 端口号,如果使用 Unix 套接字则为 -1

backend_start timestamp with time zone

此进程启动的时间,即客户端连接到此 WAL 发送器的时间

backend_xmin xid

此备用服务器的 xmin 视界,由 hot_standby_feedback 报告。

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 到收到此备用服务器已写入(但尚未刷新或应用)的通知之间经过的时间。如果此服务器配置为同步备用,则可用于衡量 synchronous_commit 级别 remote_write 在提交时造成的延迟。

flush_lag interval

从本地刷新最近的 WAL 到收到此备用服务器已写入并刷新(但尚未应用)的通知之间经过的时间。如果此服务器配置为同步备用,则可用于衡量 synchronous_commit 级别 on 在提交时造成的延迟。

replay_lag interval

从本地刷新最近的 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 活动,则最近测量到的延迟时间将继续显示一小段时间,然后显示 NULL。

延迟时间对于物理复制自动工作。逻辑解码插件可以有选择地发出跟踪消息;如果它们不发出,跟踪机制将只显示 NULL 延迟。

注意

报告的延迟时间不是对备用服务器假设当前重放速率需要多长时间才能赶上发送服务器的预测。这样的系统在新 WAL 生成时会显示类似的持续时间,但在发送器空闲时会有所不同。特别是,当备用服务器完全赶上时,pg_stat_replication 显示的是写入、刷新和重放最后一个已报告 WAL 位置所花费的时间,而不是一些用户期望的零。这与测量最近写入事务的同步提交和事务可见性延迟的目标一致。为了减少用户期望不同延迟模型的困惑,在完全重放的空闲系统中,延迟列会在短时间后恢复为 NULL。监控系统应选择如何表示此数据:缺失数据、零或继续显示最后一个已知值。

27.2.5. pg_stat_replication_slots #

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

表 27.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

最后重置这些统计信息的时间


27.2.6. pg_stat_wal_receiver #

视图 pg_stat_wal_receiver 将只包含一行,显示关于从该接收器连接的服务器的 WAL 接收器的统计信息。

表 27.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 接收器使用的连接字符串,安全敏感字段已混淆。


27.2.7. pg_stat_recovery_prefetch #

视图 pg_stat_recovery_prefetch 将只包含一行。列 wal_distanceblock_distanceio_depth 显示当前值,其他列显示可以与 pg_stat_reset_shared 函数重置的累积计数器。

表 27.17. pg_stat_recovery_prefetch 视图

列 类型

描述

stats_reset timestamp with time zone

最后重置这些统计信息的时间

prefetch bigint

因不在缓冲区池中而预取的块数

hit bigint

因已在缓冲区池中而未预取的块数

skip_init bigint

因将被零初始化而未预取的块数

skip_new bigint

因尚不存在而未预取的块数

skip_fpw bigint

因 WAL 中包含完整页面映像而未预取的块数

skip_rep bigint

因最近已预取而未预取的块数

wal_distance int

预取器向前查看的字节数

block_distance int

预取器向前查看的块数

io_depth int

已发起但尚未完成的预取次数


27.2.8. pg_stat_subscription #

表 27.18. pg_stat_subscription 视图

列 类型

描述

subid oid

订阅的 OID

subname name

订阅的名称

worker_type text

订阅工作进程的类型。可能的类型为 applyparallel applytable synchronization

pid integer

订阅工作进程的进程 ID

leader_pid integer

如果此进程是并行应用工作进程,则为领导应用工作进程的进程 ID;如果此进程是领导应用工作进程或表同步工作进程,则为 NULL

relid oid

工作进程正在同步的关系的 OID;领导应用工作进程和并行应用工作进程为 NULL

received_lsn pg_lsn

接收到的最后一个写前日志位置,此字段的初始值为 0;并行应用工作进程为 NULL

last_msg_send_time timestamp with time zone

从原始 WAL 发送器收到的最后一条消息的发送时间;并行应用工作进程为 NULL

last_msg_receipt_time timestamp with time zone

从原始 WAL 发送器收到的最后一条消息的接收时间;并行应用工作进程为 NULL

latest_end_lsn pg_lsn

报告给原始 WAL 发送器的最后一个写前日志位置;并行应用工作进程为 NULL

latest_end_time timestamp with time zone

报告给原始 WAL 发送器的最后一个写前日志位置的时间;并行应用工作进程为 NULL


27.2.9. pg_stat_subscription_stats #

视图 pg_stat_subscription_stats 将包含每个订阅一行。

表 27.19. pg_stat_subscription_stats 视图

列 类型

描述

subid oid

订阅的 OID

subname name

订阅的名称

apply_error_count bigint

应用更改时发生错误的次数。请注意,任何导致应用错误的冲突都会计入 apply_error_count 和相应的冲突计数(例如 confl_*)。

sync_error_count bigint

在初始表同步期间发生错误的次数

confl_insert_exists bigint

在应用更改期间,行插入违反 NOT DEFERRABLE 唯一约束的次数。有关此冲突的详细信息,请参阅 insert_exists

confl_update_origin_differs bigint

在应用更改期间,更新应用于先前已被另一个源修改过的行的次数。有关此冲突的详细信息,请参阅 update_origin_differs

confl_update_exists bigint

在应用更改期间,更新后的行值违反 NOT DEFERRABLE 唯一约束的次数。有关此冲突的详细信息,请参阅 update_exists

confl_update_missing bigint

在应用更改期间,要更新的元组未找到的次数。有关此冲突的详细信息,请参阅 update_missing

confl_delete_origin_differs bigint

在应用更改期间,删除操作应用于先前已被另一个源修改过的行的次数。有关此冲突的详细信息,请参阅 delete_origin_differs

confl_delete_missing bigint

在应用更改期间,要删除的元组未找到的次数。有关此冲突的详细信息,请参阅 delete_missing

confl_multiple_unique_conflicts bigint

在应用更改期间,行插入或更新行值违反多个 NOT DEFERRABLE 唯一约束的次数。有关此冲突的详细信息,请参阅 multiple_unique_conflicts

stats_reset timestamp with time zone

最后重置这些统计信息的时间


27.2.10. pg_stat_ssl #

视图 pg_stat_ssl 将包含每个后端或 WAL 发送进程一行,显示关于此连接上 SSL 使用情况的统计信息。它可以与 pg_stat_activitypg_stat_replicationpid 列上连接,以获取关于连接的更多详细信息。

表 27.20. pg_stat_ssl 视图

列 类型

描述

pid integer

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

ssl boolean

如果此连接上使用了 SSL,则为 True

version text

使用的 SSL 版本,如果此连接上未使用 SSL,则为 NULL

cipher text

使用的 SSL 密码名称,如果此连接上未使用 SSL,则为 NULL

bits integer

使用的加密算法的位数,如果此连接上未使用 SSL,则为 NULL

client_dn text

使用的客户端证书的专有名称(DN)字段,如果没有提供客户端证书或此连接上未使用 SSL,则为 NULL。如果 DN 字段长于 NAMEDATALEN(标准构建中为 64 个字符),则此字段将被截断。

client_serial numeric

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

issuer_dn text

客户端证书颁发者的 DN,如果没有提供客户端证书或此连接上未使用 SSL,则为 NULL。此字段与 client_dn 一样会被截断。


27.2.11. pg_stat_gssapi #

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

表 27.21. pg_stat_gssapi 视图

列 类型

描述

pid integer

后端的进程 ID

gss_authenticated boolean

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

principal text

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

encrypted boolean

如果此连接上正在使用 GSSAPI 加密,则为 True

credentials_delegated boolean

如果此连接上已委派 GSSAPI 凭据,则为 True。


27.2.12. pg_stat_archiver #

视图 pg_stat_archiver 将始终包含一个行,包含关于群集归档进程的数据。

表 27.22. 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

最后重置这些统计信息的时间


通常,WAL 文件是按顺序归档的,从旧到新,但这不能保证,在特殊情况下(如提升备用服务器或崩溃恢复后)也无法保证。因此,不能假定 last_archived_wal 之前的所有文件也已成功归档。

27.2.13. pg_stat_io #

视图 pg_stat_io 将包含每个后端类型、目标 I/O 对象和 I/O 上下文的组合一行,显示群集范围内的 I/O 统计信息。不合理的组合将被省略。

目前,跟踪了关系(例如表、索引)和 WAL 活动的 I/O。但是,绕过共享缓冲区的关系 I/O(例如,在将表从一个表空间移动到另一个表空间时)目前未被跟踪。

表 27.23. pg_stat_io 视图

列 类型

描述

backend_type text

后端类型(例如,后台工作进程、自动 VACUUM 工作进程)。有关 backend_type 的更多信息,请参阅 pg_stat_activity。某些 backend_type 不会累积 I/O 操作统计信息,也不会包含在视图中。

object text

I/O 操作的目标对象。可能的值为

  • relation:永久关系。

  • temp relation:临时关系。

  • wal:写前日志。

context text

I/O 操作的上下文。可能的值为

  • normal:I/O 操作类型的默认或标准 context。例如,默认情况下,关系数据被读入并从共享缓冲区写出。因此,关系数据与共享缓冲区的读写在 context normal 中被跟踪。

  • init:在创建 WAL 段期间执行的 I/O 操作在 context init 中被跟踪。

  • vacuum:在对永久关系执行 VACUUM 和 ANALYZE 时在共享缓冲区外部执行的 I/O 操作。临时表 VACUUM 使用与任何其他临时表 I/O 操作相同的本地缓冲区池,并在 context normal 中被跟踪。

  • bulkread:在共享缓冲区外部执行的某些大型读取 I/O 操作,例如,顺序扫描一个大表。

  • bulkwrite:在共享缓冲区外部执行的某些大型写入 I/O 操作,例如 COPY

reads bigint

读取操作的数量。

read_bytes numeric

读取操作的总大小(以字节为单位)。

read_time double precision

等待读取操作所花费的时间(毫秒)(如果启用了 track_io_timingobject 不是 wal,或者如果启用了 track_wal_io_timingobjectwal,否则为零)

writes bigint

写入操作的数量。

write_bytes numeric

写入操作的总大小(以字节为单位)。

write_time double precision

等待写入操作所花费的时间(毫秒)(如果启用了 track_io_timingobject 不是 wal,或者如果启用了 track_wal_io_timingobjectwal,否则为零)

writebacks bigint

进程请求内核写入永久存储的 BLCKSZ(通常为 8kB)大小的单位数量。

writeback_time double precision

等待写回操作所花费的时间(毫秒)(如果启用了 track_io_timing,否则为零)。这包括了排队写出请求的时间,以及可能花费的写出脏数据的时间。

extends bigint

关系扩展操作的数量。

extend_bytes numeric

关系扩展操作的总大小(以字节为单位)。

extend_time double precision

等待扩展操作所花费的时间(毫秒)。(如果启用了 track_io_timingobject 不是 wal,或者如果启用了 track_wal_io_timingobjectwal,否则为零)

hits bigint

在共享缓冲区中找到所需块的次数。

evictions bigint

为了腾出空间供其他用途而将块写入共享或本地缓冲区次数。

context normal 中,这计算了块从缓冲区中被驱逐并替换为另一个块的次数。在 context bulkwritebulkreadvacuum 中,这计算了块从共享缓冲区中被驱逐以将共享缓冲区添加到单独的、大小受限的环形缓冲区以供批量 I/O 操作使用的次数。

reuses bigint

bulkreadbulkwritevacuum context 中,作为 I/O 操作一部分的、大小受限的环形缓冲区中现有缓冲区的重用次数。

fsyncs bigint

fsync 调用次数。这些仅在 context normal 中被跟踪。

fsync_time double precision

等待 fsync 操作所花费的时间(毫秒)(如果启用了 track_io_timingobject 不是 wal,或者如果启用了 track_wal_io_timingobjectwal,否则为零)

stats_reset timestamp with time zone

最后重置这些统计信息的时间。


某些后端类型从不执行某些 I/O 对象和/或某些 I/O 上下文上的 I/O 操作。这些行将从视图中省略。例如,检查点进程不会检查临时表,因此对于 backend_type checkpointerobject temp relation 将没有行。

此外,某些 I/O 操作永远不会由特定后端类型或在特定 I/O 对象和/或特定 I/O 上下文中执行。这些单元格将为 NULL。例如,临时表不会被 fsync,因此 fsyncs 对于 object temp relation 将为 NULL。同样,后台写入器不执行读取,因此 reads 对于 backend_type background writer 的行将为 NULL。

对于 object walfsyncsfsync_time 跟踪在 issue_xlog_fsync 中完成的 WAL 文件的 fsync 活动。writeswrite_time 跟踪在 XLogWrite 中完成的 WAL 文件的写入活动。有关更多信息,请参阅 第 28.5 节

pg_stat_io 可用于指导数据库调优。例如:

  • evictions 计数可能表明应增加共享缓冲区。

  • 客户端后端依赖于检查点进程来确保数据持久化到永久存储。客户端后端的大量 fsyncs 可能表明共享缓冲区或检查点进程配置不当。有关配置检查点进程的更多信息,请参阅 第 28.5 节

  • 通常,客户端后端应该能够依赖辅助进程(如检查点进程和后台写入器)来尽可能多地写出脏数据。客户端后端的大量写入可能表明共享缓冲区或检查点进程配置不当。有关配置检查点进程的更多信息,请参阅 第 28.5 节

注意

跟踪 I/O 等待时间的列仅在启用 track_io_timing 时才非零。用户在引用这些列与其对应的 I/O 操作时应小心,以防 track_io_timing 在自上次统计信息重置以来的整个时间段内未被启用。

27.2.14. pg_stat_bgwriter #

视图 pg_stat_bgwriter 将始终包含一个行,包含关于群集后台写入器的数据。

表 27.24. pg_stat_bgwriter 视图

列 类型

描述

buffers_clean bigint

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

maxwritten_clean bigint

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

buffers_alloc bigint

分配的缓冲区数量

stats_reset timestamp with time zone

最后重置这些统计信息的时间


27.2.15. pg_stat_checkpointer #

视图 pg_stat_checkpointer 将始终包含一个行,包含关于群集检查点进程的数据。

表 27.25. pg_stat_checkpointer 视图

列 类型

描述

num_timed bigint

由于超时而安排的检查点数量

num_requested bigint

请求的检查点数量

num_done bigint

已执行的检查点数量

restartpoints_timed bigint

由于超时或在尝试执行失败后而安排的重启点数量

restartpoints_req bigint

请求的重启点数量

restartpoints_done bigint

已执行的重启点数量

write_time double precision

在检查点和重启点的处理过程中,文件被写入磁盘的部分所花费的总时间(毫秒)

sync_time double precision

在检查点和重启点的处理过程中,文件被同步到磁盘的部分所花费的总时间(毫秒)

buffers_written bigint

在检查点和重启点期间写入的共享缓冲区数量

slru_written bigint

在检查点和重启点期间写入的 SLRU 缓冲区数量

stats_reset timestamp with time zone

最后重置这些统计信息的时间


如果服务器自上次检查点以来一直处于空闲状态,则可能会跳过检查点。 num_timednum_requested 计算已完成和已跳过的检查点,而 num_done 仅跟踪已完成的检查点。同样,如果最后一个重放的检查点记录已经是最后一个重启点,则可能会跳过重启点。 restartpoints_timedrestartpoints_req 计算已完成和已跳过的重启点,而 restartpoints_done 仅跟踪已完成的重启点。

27.2.16. pg_stat_wal #

视图 pg_stat_wal 将始终包含一个行,包含关于群集 WAL 活动的数据。

表 27.26. pg_stat_wal 视图

列 类型

描述

wal_records bigint

生成的 WAL 记录总数

wal_fpi bigint

生成的 WAL 全页映像总数

wal_bytes numeric

生成的 WAL 总量(以字节为单位)

wal_buffers_full bigint

WAL 缓冲区已满而将 WAL 数据写入磁盘的次数

stats_reset timestamp with time zone

最后重置这些统计信息的时间


27.2.17. pg_stat_database #

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

表 27.27. 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

此数据库中的查询创建的临时文件数量。所有临时文件都将被计算在内,无论临时文件创建的原因是什么(例如,排序或哈希),也无论 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 中的 activefastpath function call 状态)

idle_in_transaction_time double precision

在此数据库中,在事务中空闲所花费的时间(毫秒)(这对应于 pg_stat_activity 中的 idle in transactionidle in transaction (aborted) 状态)

sessions bigint

已建立到此数据库的总会话数

sessions_abandoned bigint

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

sessions_fatal bigint

到此数据库的数据库会话因致命错误而终止的数量

sessions_killed bigint

到此数据库的数据库会话因操作员干预而终止的数量

parallel_workers_to_launch bigint

计划由该数据库上的查询启动的并行工作进程数

parallel_workers_launched bigint

由该数据库上的查询启动的并行工作进程数

stats_reset timestamp with time zone

最后重置这些统计信息的时间


27.2.18. pg_stat_database_conflicts #

视图 pg_stat_database_conflicts 将包含每个数据库一行,显示数据库范围的关于因与备用服务器上的恢复冲突而发生的查询取消的统计信息。此视图仅在备用服务器上包含信息,因为主服务器上不会发生冲突。

表 27.28. pg_stat_database_conflicts 视图

列 类型

描述

datid oid

数据库的 OID

datname name

此数据库的名称

confl_tablespace bigint

此数据库中因删除表空间而被取消的查询数量

confl_lock bigint

此数据库中因锁超时而被取消的查询数量

confl_snapshot bigint

此数据库中因旧快照而被取消的查询数量

confl_bufferpin bigint

此数据库中因缓冲区固定而被取消的查询数量

confl_deadlock bigint

此数据库中因死锁而被取消的查询数量

confl_active_logicalslot bigint

此数据库中因旧快照或主服务器上的 wal_level 太低而被取消的逻辑槽使用次数


27.2.19. pg_stat_all_tables #

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

表 27.29. pg_stat_all_tables 视图

列 类型

描述

relid oid

表的 OID

schemaname name

此表所在的模式名称

relname name

此表的名称

seq_scan bigint

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

last_seq_scan timestamp with time zone

此表上最后一次顺序扫描的时间,基于最近的事务停止时间

seq_tup_read bigint

顺序扫描获取的活动行数

idx_scan bigint

在此表上启动的索引扫描次数

last_idx_scan timestamp with time zone

此表上最后一次索引扫描的时间,基于最近的事务停止时间

idx_tup_fetch bigint

索引扫描获取的活动行数

n_tup_ins bigint

插入的总行数

n_tup_upd bigint

更新的总行数。(这包括在 n_tup_hot_updn_tup_newpage_upd 中计算的行更新,以及剩余的非HOT更新。)

n_tup_del bigint

删除的总行数

n_tup_hot_upd bigint

HOT 更新的行数。这些更新不需要在索引中创建后继版本。

n_tup_newpage_upd bigint

更新的行数,其中后继版本转到新的堆页,留下一个原始版本,其 t_ctid 字段 指向不同的堆页。这些始终是非HOT更新。

n_live_tup bigint

估计的活动行数

n_dead_tup bigint

估计的死行数

n_mod_since_analyze bigint

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

n_ins_since_vacuum bigint

自上次 VACUUM 此表以来插入的估计行数(不包括 VACUUM FULL

last_vacuum timestamp with time zone

上次手动 VACUUM 此表的时间(不包括 VACUUM FULL

last_autovacuum timestamp with time zone

上次此表被 autovacuum 守护进程 VACUUM 的时间

last_analyze timestamp with time zone

上次手动分析此表的时间

last_autoanalyze timestamp with time zone

上次此表被 autovacuum 守护进程分析的时间

vacuum_count bigint

手动 VACUUM 此表的次数(不包括 VACUUM FULL

autovacuum_count bigint

此表被 autovacuum 守护进程 VACUUM 的次数

analyze_count bigint

手动分析此表的次数

autoanalyze_count bigint

此表被 autovacuum 守护进程分析的次数

total_vacuum_time double precision

手动 VACUUM 此表所花费的总时间(毫秒)(不包括 VACUUM FULL)。(这包括由于成本延迟而进入睡眠的时间。)

total_autovacuum_time double precision

此表被 autovacuum 守护进程 VACUUM 的总时间(毫秒)。(这包括由于成本延迟而进入睡眠的时间。)

total_analyze_time double precision

手动分析此表所花费的总时间(毫秒)。(这包括由于成本延迟而进入睡眠的时间。)

total_autoanalyze_time double precision

此表被 autovacuum 守护进程分析的总时间(毫秒)。(这包括由于成本延迟而进入睡眠的时间。)


27.2.20. pg_stat_all_indexes #

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

表 27.30. pg_stat_all_indexes 视图

列 类型

描述

relid oid

此索引所在表的 OID

indexrelid oid

此索引的 OID

schemaname name

此索引所在模式的名称

relname name

此索引所在表的名称

indexrelname name

此索引的名称

idx_scan bigint

在此索引上启动的索引扫描次数

last_idx_scan timestamp with time zone

此索引上最后一次扫描的时间,基于最近的事务停止时间

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_readidx_tup_fetch 的计数也可能不同,因为 idx_tup_read 计算的是从索引检索到的索引条目,而 idx_tup_fetch 计算的是从表中获取的活动行。后者如果获取了任何死行或尚未提交的行,或者如果通过索引扫描避免了任何堆获取,则会减少。

注意

索引扫描有时可能每次执行执行多次索引搜索。每次索引搜索都会增加 pg_stat_all_indexes.idx_scan,因此索引扫描的计数可能显著超过索引扫描执行节点执行的总数。

这可能发生在具有某些SQL构造的查询中,用于搜索匹配列表或数组中任何标量值列表的行(请参阅 第 9.25 节)。对于具有 column_name = value1 OR column_name = value2 ... 构造的查询也可能发生这种情况,但仅当优化器将构造转换为等效的多值数组表示形式时。类似地,当 B-tree 索引扫描使用跳过扫描优化时,每次扫描重新定位到可能具有匹配元组的下一个索引叶页面时,都会执行一次索引搜索(请参阅 第 11.3 节)。

提示

EXPLAIN ANALYZE 输出每个索引扫描节点执行的总索引搜索次数。有关演示此工作原理的示例,请参阅 第 14.1.2 节

27.2.21. pg_statio_all_tables #

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

表 27.31. 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 表索引(如果存在)中的缓冲区命中次数


27.2.22. pg_statio_all_indexes #

视图 pg_statio_all_indexes 将包含当前数据库中每个索引一行,显示关于对该特定索引的 I/O 的统计信息。视图 pg_statio_user_indexespg_statio_sys_indexes 包含相同的信息,但经过过滤,仅分别显示用户索引和系统索引。

表 27.32. pg_statio_all_indexes 视图

列 类型

描述

relid oid

此索引所在表的 OID

indexrelid oid

此索引的 OID

schemaname name

此索引所在模式的名称

relname name

此索引所在表的名称

indexrelname name

此索引的名称

idx_blks_read bigint

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

idx_blks_hit bigint

此索引中的缓冲区命中次数


27.2.23. pg_statio_all_sequences #

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

表 27.33. pg_statio_all_sequences 视图

列 类型

描述

relid oid

序列的 OID

schemaname name

此序列所在模式的名称

relname name

此序列的名称

blks_read bigint

从此序列读取的磁盘块数量

blks_hit bigint

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


27.2.24. pg_stat_user_functions #

视图 pg_stat_user_functions 将包含每个跟踪函数一行,显示关于该函数执行的统计信息。track_functions 参数控制确切要跟踪哪些函数。

表 27.34. pg_stat_user_functions 视图

列 类型

描述

funcid oid

函数的 OID

schemaname name

此函数所在的模式名称

funcname name

此函数的名称

calls bigint

调用此函数的次数

total_time double precision

在此函数及其调用的所有其他函数中花费的总时间(毫秒)

self_time double precision

仅在此函数本身中花费的总时间,不包括它调用的其他函数(毫秒)


27.2.25. pg_stat_slru #

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

对于作为核心服务器一部分的每个 SLRU 缓存,都有一个控制其大小的配置参数,后缀为 _buffers

表 27.35. 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

最后重置这些统计信息的时间


27.2.26. 统计函数 #

可以通过编写使用与上述标准视图相同的底层统计访问函数的查询来设置查看统计信息的其他方式。有关函数名称等详细信息,请参阅标准视图的定义。(例如,在 psql 中,您可以发出 \d+ pg_stat_activity。)用于数据库范围统计信息的访问函数接受数据库 OID 作为参数来标识要报告的数据库。用于表和索引的函数接受表或索引 OID。用于函数范围统计信息的函数接受函数 OID。请注意,只能通过这些函数查看当前数据库中的表、索引和函数。

与累积统计系统相关的其他函数列在 表 27.36 中。

表 27.36. 其他统计函数

函数

描述

pg_backend_pid () → integer

返回连接到当前会话的服务器进程的进程 ID。

pg_stat_get_backend_io ( integer ) → setof record

返回具有指定进程 ID 的后端的 I/O 统计信息。输出字段与 pg_stat_io 视图中的字段完全相同。

该函数不返回检查点进程、后台写入器、启动进程和 autovacuum 启动器的 I/O 统计信息,因为它们已在 pg_stat_io 视图中可见,并且每种只有一个。

pg_stat_get_activity ( integer ) → setof record

如果指定 NULL,则返回指定进程 ID 的后端的记录信息,或者返回系统中每个活动后端的记录。返回的字段是 pg_stat_activity 视图字段的子集。

pg_stat_get_backend_wal ( integer ) → record

返回指定进程 ID 的后端的 WAL 统计信息。输出字段与 pg_stat_wal 视图中的字段完全相同。

该函数不返回检查点进程、后台写入器、启动进程和 autovacuum 启动器的 WAL 统计信息。

pg_stat_get_snapshot_timestamp () → timestamp with time zone

返回当前统计信息快照的时间戳,如果未拍摄统计信息快照,则为 NULL。如果 stats_fetch_consistency 设置为 snapshot,则在事务中第一次访问累积统计信息时会拍摄快照。

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 ( [ target text DEFAULT NULL ] ) → void

根据参数将某些集群范围的统计信息计数器重置为零。target 可以是:

  • archiver: 重置 pg_stat_archiver 视图中显示的所有计数器。

  • bgwriter: 重置 pg_stat_bgwriter 视图中显示的所有计数器。

  • checkpointer: 重置 pg_stat_checkpointer 视图中显示的所有计数器。

  • io: 重置 pg_stat_io 视图中显示的所有计数器。

  • recovery_prefetch: 重置 pg_stat_recovery_prefetch 视图中显示的所有计数器。

  • slru: 重置 pg_stat_slru 视图中显示的所有计数器。

  • wal: 重置 pg_stat_wal 视图中显示的所有计数器。

  • NULL 或未指定:重置上面列出的视图中的所有计数器。

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

pg_stat_reset_single_table_counters ( oid ) → void

将当前数据库中单个表或索引的统计信息,或跨集群所有数据库共享的统计信息重置为零。

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

pg_stat_reset_backend_stats ( integer ) → void

将指定进程 ID 的单个后端进程的统计信息重置为零。

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

pg_stat_reset_single_function_counters ( oid ) → void

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

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

pg_stat_reset_slru ( [ target text DEFAULT NULL ] ) → void

将单个 SLRU 缓存的统计信息重置为零,或将集群中所有 SLRU 的统计信息重置为零。如果 targetNULL 或未指定,则重置 pg_stat_slru 视图中显示的所有 SLRU 缓存的计数器。参数可以是 commit_timestamp, multixact_member, multixact_offset, notify, serializable, subtransaction, 或 transaction 中的一个,以仅重置该条目的计数器。如果参数为 other(或任何未识别的名称),则会重置所有其他 SLRU 缓存的计数器,例如扩展定义的缓存。

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

pg_stat_reset_replication_slot ( text ) → void

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

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

pg_stat_reset_subscription_stats ( oid ) → void

pg_stat_subscription_stats 视图中显示的单个订阅的统计信息重置为零。如果参数为 NULL,则重置所有订阅的统计信息。

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


警告

使用 pg_stat_reset() 也会重置 autovacuum 用来确定何时触发 vacuum 或 analyze 的计数器。重置这些计数器可能会导致 autovacuum 不执行必要的工作,从而可能导致表膨胀或表统计信息过时等问题。建议在重置统计信息后执行一次数据库范围的 ANALYZE

pg_stat_get_activitypg_stat_activity 视图的底层函数,它返回一个记录集,包含每个后端进程的所有可用信息。有时,只获取部分信息可能更方便。在这种情况下,可以使用另一组每个后端进程的统计信息访问函数;这些函数在表 27.37 中显示。这些访问函数使用会话的后端 ID 号,这是一个小整数(>= 0),与任何并发会话的后端 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;

表 27.37. 每个后端进程的统计信息函数

函数

描述

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_idset () → setof integer

返回当前活动后端进程 ID 号的集合。

pg_stat_get_backend_pid ( integer ) → integer

返回此后端进程的进程 ID。

pg_stat_get_backend_start ( integer ) → timestamp with time zone

返回此进程启动的时间。

pg_stat_get_backend_subxact ( integer ) → record

返回指定 ID 的后端进程的子事务信息记录。返回的字段包括 subxact_count(后端进程子事务缓存中的子事务数量)和 subxact_overflow(指示后端进程子事务缓存是否溢出)。

pg_stat_get_backend_userid ( integer ) → oid

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

pg_stat_get_backend_wait_event ( integer ) → text

如果此后端进程当前正在等待,则返回等待事件名称,否则返回 NULL。请参阅表 27.5表 27.13

pg_stat_get_backend_wait_event_type ( integer ) → text

如果此后端进程当前正在等待,则返回等待事件类型名称,否则返回 NULL。有关详细信息,请参阅表 27.4

pg_stat_get_backend_xact_start ( integer ) → timestamp with time zone

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


提交更正

如果您在文档中发现任何不正确、与您对特定功能的体验不符或需要进一步澄清的内容,请使用此表单报告文档问题。