27.2. 统计收集器 #
- 27.2.1. 统计信息收集配置
- 27.2.2. 查看统计信息
- 27.2.3.
pg_stat_activity - 27.2.4.
pg_stat_replication - 27.2.5.
pg_stat_wal_receiver - 27.2.6.
pg_stat_subscription - 27.2.7.
pg_stat_ssl - 27.2.8.
pg_stat_gssapi - 27.2.9.
pg_stat_archiver - 27.2.10.
pg_stat_bgwriter - 27.2.11.
pg_stat_database - 27.2.12.
pg_stat_database_conflicts - 27.2.13.
pg_stat_all_tables - 27.2.14.
pg_stat_all_indexes - 27.2.15.
pg_statio_all_tables - 27.2.16.
pg_statio_all_indexes - 27.2.17.
pg_statio_all_sequences - 27.2.18.
pg_stat_user_functions - 27.2.19.
pg_stat_slru - 27.2.20. 统计函数
PostgreSQL 的统计收集器是一个支持收集和报告服务器活动信息的子系统。目前,对表和索引的访问会按磁盘块和行两种口径计数。每个表中的总行数,以及每个表的清理和分析操作的信息也被计数。它还可以统计对用户定义函数的调用和每个函数中花费的总时间。
PostgreSQL 也支持报告关于系统当前正在发生的情况的动态信息,例如其他服务器进程当前正在执行的确切命令,以及系统中存在哪些其他连接。此功能独立于收集器进程。
27.2.1. 统计信息收集配置 #
由于收集统计信息会增加查询执行的开销,因此可以配置系统是否收集信息。这由通常在 postgresql.conf 中设置的配置参数控制(有关设置配置参数的详细信息,请参阅第 19 章)。
参数 track_activities 启用对任意服务器进程当前执行命令的监控。
参数 track_counts 控制是否收集关于表和索引访问的统计信息。
参数 track_functions 启用对用户定义函数使用的跟踪。
参数 track_io_timing 启用对块读取和写入时间的监控。
通常,这些参数会设置在 postgresql.conf 中,以便它们适用于所有服务器进程,但也可以在单个会话中使用 SET 命令打开或关闭它们。(为防止普通用户隐藏其活动不被管理员发现,只有超级用户才能使用 SET 更改这些参数。)
统计收集器通过临时文件把收集到的信息传递给其他 PostgreSQL 进程。这些文件默认存放在由 stats_temp_directory 参数指定的目录中,即 pg_stat_tmp。为了获得更好的性能,可以把 stats_temp_directory 指向基于 RAM 的文件系统,以减少物理 I/O 需求。当服务器正常关闭时,统计信息数据的永久副本会存储在 pg_stat 子目录中,以便在服务器重启后保留这些统计信息。当服务器启动时执行恢复时(例如立即关闭后、服务器崩溃后以及进行时间点恢复时),所有统计计数器都会被重置。
27.2.2. 查看统计信息 #
有几个预定义视图列在表 27.1 中,可用于显示系统的当前状态。另有几个视图列在表 27.2 中,可用于显示统计信息收集的结果。或者,也可以像第 27.2.20 节中所述那样,使用底层的统计函数构建自定义视图。
当使用统计信息来监视收集到的数据时,重要的是要意识到信息不会立即更新。每个单独的服务器进程会在转为空闲之前把新的统计计数发送给收集器,因此仍在进行中的查询或事务不会影响显示的总计。并且,收集器本身最多每隔 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 中看到自己的统计信息(这些统计信息尚未传送给收集器)。这些数字不像上面所述那样起作用;相反,它们在事务期间持续更新。
表 27.1 所列动态统计视图中的一些信息受到安全限制。普通用户只能查看其自身会话的全部信息(包括属于其所加入角色的会话)。对于其他会话的行,许多列将为空值。不过,会话的存在及其一般属性(例如会话用户和数据库)对所有用户都可见。超级用户和内置角色 pg_read_all_stats 的成员(另请参阅第 21.5 节)可以查看所有会话的全部信息。
表 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_subscription | 每个订阅至少一行,显示有关订阅工作进程的信息。有关详细信息,请参阅 pg_stat_subscription。
|
pg_stat_ssl | 每个连接(常规连接和复制连接)一行,显示有关该连接上使用的 SSL 的信息。有关详细信息,请参阅 pg_stat_ssl。
|
pg_stat_gssapi | 每个连接(常规连接和复制连接)一行,显示有关该连接上使用的 GSSAPI 认证和加密的信息。有关详细信息,请参阅 pg_stat_gssapi。
|
pg_stat_progress_analyze | 每个正在运行 ANALYZE 的后端(包括自动清理工作进程)一行,显示当前进度。请参阅第 27.4.1 节。
|
pg_stat_progress_create_index | 每个正在运行 CREATE INDEX 或 REINDEX 的后端一行,显示当前进度。请参阅第 27.4.2 节。
|
pg_stat_progress_vacuum | 每个正在运行 VACUUM 的后端(包括自动清理工作进程)一行,显示当前进度。请参阅第 27.4.3 节。
|
pg_stat_progress_cluster | 每个正在运行 CLUSTER 或 VACUUM FULL 的后端一行,显示当前进度。请参阅第 27.4.4 节。
|
pg_stat_progress_basebackup | 每个正在流式传输基础备份的 WAL 发送进程一行,显示当前进度。请参阅第 27.4.5 节。 |
表 27.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_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_statio_视图主要用于判断缓冲区缓存的有效性。如果实际磁盘读取次数远少于缓冲区命中次数,缓存就能满足大多数读取请求,而无需调用内核。不过,这些统计信息并不能反映全部情况:由于 PostgreSQL 处理磁盘 I/O 的方式,不在 PostgreSQL 缓冲区缓存中的数据仍可能驻留在内核的 I/O 缓存中,因而仍可在不执行物理读取的情况下取得。对于希望更详细地了解 PostgreSQL I/O 行为的用户,建议将 PostgreSQL 统计收集器与能够深入查看内核 I/O 处理情况的操作系统工具结合使用。
27.2.3. pg_stat_activity #
pg_stat_activity 视图每个服务器进程将有一行,显示与该进程当前活动相关的信息。
表 27.3. pg_stat_activity 视图
列类型 描述 |
|---|
这个后端连接到的数据库的 OID |
这个后端连接到的数据库的名称 |
这个后端的进程 ID |
如果此进程是并行查询工作进程,则为并行组领导者的进程 ID。如果此进程是并行组领导者或者不参与并行查询,则为 |
登录到这个后端的用户的 OID |
登录到此后端的用户名称 |
连接到此后端的应用名称 |
连接到这个后端的客户端的 IP 地址。如果这个字段为空值,它表示客户端通过服务器机器上的一个 Unix 套接字连接或者这是一个内部进程,如自动清理。 |
已连接的客户端的主机名,由 |
客户端用于与此后端通信的 TCP 端口号,如果使用 Unix 套接字,则为 |
这个进程被启动的时间。对客户端后端来说,这就是客户端连接到服务器的时间。 |
这个进程的当前事务被启动的时间,如果没有活动事务则为空值。如果当前查询是其事务中的第一个查询,这一列等于 |
当前活动查询开始的时间;如果 |
|
后端正在等待的事件类型(如果有);否则为空值。请参阅表 27.4。 |
|
该后端当前的总体状态。可能的值为:
|
这个后端的顶层事务 ID,如果存在。 |
当前后端的 |
这个后端最近查询的文本。如果 |
当前后端的类型。可能的类型为 |
注意
wait_event 和 state 列彼此独立。如果某个后端处于 active 状态,它可能在等待(waiting)某个事件,也可能没有等待。如果状态为 active 且 wait_event 非空,就意味着某个查询正在执行,但在系统中的某处被阻塞了。
表 27.4. 等待事件类型
| 等待事件类型 | 描述 |
|---|---|
Activity | 服务器进程空闲。此事件类型表示在其主处理循环中等待活动的进程。wait_event 将标识具体的等待点;参见表 27.5。
|
BufferPin | 服务器进程正在等待独占访问一个数据缓冲区。如果另一个进程持有尚未关闭的游标,且该游标最近读取的数据来自此缓冲区,缓冲区钉住等待就可能持续较长时间。参见表 27.6。 |
Client | 服务器进程正在等待连接到用户应用程序的套接字上的活动。因此,服务器预计发生一些独立于其内部进程的事情。wait_event 将识别特定的等待点;参见表 27.7。
|
Extension | 服务器进程正在等待扩展模块定义的某个条件。参见表 27.8。 |
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 | 在自动清理启动进程的主循环中等待。 |
BgWriterHibernate | 在后台写入器进程中休眠等待。 |
BgWriterMain | 在后台写入器主循环中等待。 |
CheckpointerMain | 在检查点进程的主循环中等待。 |
LogicalApplyMain | 在逻辑复制应用进程的主循环中等待。 |
LogicalLauncherMain | 在逻辑复制启动器进程的主循环中等待。 |
PgStatMain | 在统计收集器进程的主循环中等待。 |
RecoveryWalStream | 在流恢复期间,在启动进程的主循环中等待 WAL 到达。 |
SysLoggerMain | 在 syslogger 进程的主循环中等待。 |
WalReceiverMain | 在 WAL 接收进程的主循环中等待。 |
WalSenderMain | 在 WAL 发送进程的主循环中等待。 |
WalWriterMain | 在 WAL 写入进程的主循环中等待。 |
表 27.6. BufferPin 类型的等待事件
BufferPin 等待事件 | 描述 |
|---|---|
BufferPin | 等待获得缓冲区上的独占钉住。 |
表 27.7. Client 类型的等待事件
Client 等待事件 | 描述 |
|---|---|
ClientRead | 等待从客户端读取数据。 |
ClientWrite | 等待写入数据到客户端。 |
GSSOpenServer | 在建立 GSSAPI 会话时等待从客户端读取数据。 |
LibPQWalReceiverConnect | 在 WAL 接收进程中等待与远程服务器建立连接。 |
LibPQWalReceiverReceive | 在 WAL 接收进程中等待从远程服务器接收数据。 |
SSLOpenServer | 在尝试连接时等待 SSL。 |
WalReceiverWaitStart | 等待启动进程为流复制发送初始数据。 |
WalSenderWaitForWAL | 在 WAL 发送进程中等待 WAL 刷盘。 |
WalSenderWriteData | 在 WAL 发送进程中处理 WAL 接收进程的回复时,等待任何活动。 |
表 27.8. Extension 类型的等待事件
Extension 等待事件 | 描述 |
|---|---|
Extension | 在扩展中等待。 |
表 27.9. IO 类型的等待事件
IO 等待事件 | 描述 |
|---|---|
BufFileRead | 等待从缓冲文件中读取。 |
BufFileWrite | 等待对缓冲文件的写入。 |
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 文件。 |
表 27.10. IPC 类型的等待事件
IPC 等待事件 | 描述 |
|---|---|
BackupWaitWalArchive | 等待备份所需的 WAL 文件成功归档。 |
BgWorkerShutdown | 等待后台工作进程关闭。 |
BgWorkerStartup | 等待后台工作进程启动。 |
BtreePage | 等待继续并行 B-树扫描所需的页号变得可用。 |
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 | 在同步复制期间等待来自远程服务器的确认。 |
XactGroupUpdate | 等待组领导者在事务结束时更新事务状态。 |
表 27.11. Lock 类型的等待事件
Lock 等待事件 | 描述 |
|---|---|
advisory | 等待获取用户咨询锁。 |
extend | 等待扩展一个关系。 |
frozenid | 等待更新 pg_database.datfrozenxid 和 pg_database.datminmxid。 |
object | 等待获取非关系数据库对象上的锁。 |
page | 等待获取一个关系页面上的锁。 |
relation | 等待获取关系上的锁。 |
spectoken | 等待获取推测插入锁。 |
transactionid | 等待事务完成。 |
tuple | 等待获取元组上的锁。 |
userlock | 等待获取用户锁。 |
virtualxid | 等待获取虚拟事务 ID 锁。 |
表 27.12. LWLock 类型的等待事件
LWLock 等待事件 | 描述 |
|---|---|
AddinShmemInit | 等待管理扩展在共享内存中的空间分配。 |
AutoFile | 等待更新 postgresql.auto.conf 文件。 |
Autovacuum | 等待读取或更新自动清理工作进程的当前状态。 |
AutovacuumSchedule | 等待确认选中进行自动清理的表是否仍需清理。 |
BackgroundWorker | 等待读取或更新后台工作进程状态。 |
BtreeVacuum | 等待读取或更新 B-树索引的清理相关信息。 |
BufferContent | 等待访问内存中的数据页。 |
BufferIO | 等待数据页上的 I/O。 |
BufferMapping | 等待将数据块与缓冲池中的缓冲区关联。 |
Checkpoint | 等待开始检查点。 |
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 类型添加到表 27.12 所示的列表中。在某些情况下,扩展分配的名称无法在所有服务器进程中使用;因此,LWLock 等待事件可能只会被报告为“extension”,而不是扩展分配的名称。
表 27.13. Timeout 类型的等待事件
Timeout 等待事件 | 描述 |
|---|---|
BaseBackupThrottle | 在基础备份期间因限流而等待。 |
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)
27.2.4. pg_stat_replication #
pg_stat_replication 视图为每个 WAL 发送进程包含一行,显示有关复制到该发送进程所连接备库的统计信息。这里只列出直接连接的备库;不包含下游备库的信息。
表 27.14. pg_stat_replication 视图
列类型 描述 |
|---|
一个 WAL 发送进程的进程 ID |
登录到这个 WAL 发送进程的用户的 OID |
登录到这个 WAL 发送进程的用户的名称 |
连接到这个 WAL 发送进程的应用的名称 |
连接到这个 WAL 发送进程的客户端的 IP 地址。如果这个字段为空值,它表示该客户端通过服务器机器上的一个 Unix 套接字连接。 |
已连接的客户端的主机名,由 |
客户端用来与这个 WAL 发送进程通讯的 TCP 端口号,如果使用 Unix 套接字则为 |
这个进程开始的时间,即客户端是何时连接到这个 WAL 发送进程的。 |
由 hot_standby_feedback 报告的该备库的 |
当前的 WAL 发送进程状态。可能的值是:
|
在这个连接上发送的最后一个预写式日志的位置 |
该备库已写入磁盘的最后一个预写式日志位置 |
该备库已刷入磁盘的最后一个预写式日志位置 |
已在该备库数据库中重放的最后一个预写式日志位置 |
从在本地将最近的 WAL 刷盘,到收到该备库已写入该 WAL(但尚未刷盘或应用)的通知之间经过的时间。如果该服务器被配置为同步备库,可用此值衡量在提交时 |
从在本地将最近的 WAL 刷盘,到收到该备库已写入该 WAL 并将其刷盘(但尚未应用)的通知之间经过的时间。如果该服务器被配置为同步备库,可用此值衡量在提交时 |
从在本地将最近的 WAL 刷盘,到收到该备库已写入该 WAL、将其刷盘并应用的通知之间经过的时间。如果该服务器被配置为同步备库,可用此值衡量在提交时 |
在基于优先级的同步复制中,该备库被选为同步备库的优先级。在基于法定人数的同步复制中,此值不起作用。 |
该备库的同步状态。可能的值是:
|
从备库收到的最后一条回复消息的发送时间 |
pg_stat_replication 视图中报告的滞后时间,是最近的 WAL 被写入、刷盘和重放,以及发送端获知这些操作完成所花费时间的度量。如果远程服务器被配置为同步备库,这些时间表示各个同步提交级别带来或可能带来的提交延迟。对于异步备库,replay_lag 列是最近事务对查询变得可见所需延迟时间的近似值。如果备库已经完全追上发送服务器且没有新的 WAL 活动,系统会在短时间内继续显示最近测得的滞后时间,随后显示为空值。
对于物理复制,滞后时间会自动测量。逻辑解码插件可以选择发出跟踪消息;如果没有这样做,跟踪机制会将滞后显示为空值。
注意
报告出的滞后时间并不是根据当前重放速率预测该备库还需多久才能追上发送服务器。在持续生成新 WAL 时,那样的系统可能会显示相近的时间;但当发送端空闲时,就会显示不同的值。特别是当备库已经完全追上时,pg_stat_replication 显示的是写入、刷盘和重放最近报告的 WAL 位置所花费的时间,而不是某些用户可能预期的零。这样做符合为最近写事务测量同步提交和事务可见性延迟的目的。为减少用户因预期另一种滞后模型而产生的混淆,在一个已完全重放且处于空闲状态的系统上,滞后列会在较短时间后恢复为空值。监控系统应自行决定将这种情况表示为缺失数据、零,还是继续显示最近一次已知值。
27.2.5. pg_stat_wal_receiver #
pg_stat_wal_receiver 视图只包含一行,显示 WAL 接收进程从其所连接服务器接收数据的统计信息。
表 27.15. pg_stat_wal_receiver 视图
列类型 描述 |
|---|
WAL 接收进程的进程 ID |
WAL 接收进程的活动状态 |
WAL 接收进程启动时使用的第一个预写式日志位置 |
WAL 接收进程启动时使用的第一个时间线编号 |
已经接收并写入磁盘的最后一个预写式日志位置,但尚未刷盘。此字段不应用于数据完整性检查。 |
已经接收并刷入到磁盘的最后一个预写式日志位置,该字段的初始值是启动 WAL 接收进程时使用的第一个日志位置 |
接收并刷入到磁盘的最后一个预写式日志位置的时间线编号,该字段的初始值为启动 WAL 接收进程时使用的第一个日志位置的时间线编号 |
从源 WAL 发送进程收到的最后一条消息的发送时间 |
从源 WAL 发送进程收到的最后一条消息的接收时间 |
向源 WAL 发送进程报告的最后一个预写式日志位置 |
向源 WAL 发送进程报告最后一个预写式日志位置的时间 |
这个 WAL 接收进程使用的复制槽的名称 |
这个 WAL 接收进程连接到的 PostgreSQL 实例的主机。这可以是主机名、IP 地址,或者目录路径,如果连接是通过 Unix 套接字进行的。(路径的情况可以区分,因为它总是以 |
这个 WAL 接收进程连接的 PostgreSQL 实例的端口号。 |
这个 WAL 接收进程使用的连接字符串,对安全敏感的字段进行了模糊处理。 |
27.2.6. pg_stat_subscription #
pg_stat_subscription 视图为每个订阅的主工作进程包含一行(如果该工作进程未运行,则 PID 为空),并为处理订阅表初始数据复制的工作进程包含额外的行。
表 27.16. pg_stat_subscription 视图
列类型 描述 |
|---|
订阅的 OID |
订阅的名称 |
订阅工作进程的进程 ID |
该工作进程正在同步的关系的 OID;主应用工作进程则为空值 |
接收到的最后一个预写式日志位置,该字段的初始值为 0 |
从源 WAL 发送进程收到的最后一条消息的发送时间 |
从源 WAL 发送进程收到的最后一条消息的接收时间 |
向源 WAL 发送进程报告的最后一个预写式日志位置 |
向源 WAL 发送进程报告最后一个预写式日志位置的时间 |
27.2.7. pg_stat_ssl #
pg_stat_ssl 视图将为每一个后端或者 WAL 发送进程包含一行,用来显示这个连接上的 SSL 使用情况。可以把它与 pg_stat_activity 或者 pg_stat_replication 通过 pid 列连接来得到更多有关该连接的细节。
表 27.17. pg_stat_ssl 视图
列类型 描述 |
|---|
后端或 WAL 发送进程的进程 ID |
如果在此连接上使用 SSL,则为真 |
使用 SSL 的版本,如果此连接上没有使用 SSL 则为空值 |
正在使用的 SSL 密码套件的名称,如果此连接上没有使用 SSL 则为空值 |
使用的加密算法中的位数,如果此连接上没有使用 SSL 则为空值 |
使用 SSL 压缩时为真,否则为假;如果此连接未使用 SSL,则为空值 |
所用客户端证书中的区别名称(DN,Distinguished Name)字段,如果没有提供客户端证书或在此连接上没有使用 SSL,则为空值。如果 DN 字段长于 |
客户端证书的序列号,如果没有提供客户端证书或在此连接上没有使用 SSL,则为空值。证书序列号和证书颁发者的组合唯一标识一个证书(除非颁发者错误地重用序列号)。 |
客户端证书颁发者的区别名称(DN,Distinguished Name),如果没有提供客户端证书或在此连接上没有使用 SSL,则为空值。该字段像 |
27.2.8. pg_stat_gssapi #
pg_stat_gssapi 视图为每个后端包含一行,显示该连接上的 GSSAPI 使用情况。可以通过 pid 列将它与 pg_stat_activity 或 pg_stat_replication 连接,获取更多关于连接的详细信息。
表 27.18. pg_stat_gssapi 视图
列类型 描述 |
|---|
后端进程 ID |
如果此连接使用了 GSSAPI 认证,则为真 |
用于认证此连接的主体,如果未使用 GSSAPI 对此连接进行认证,则为空值。如果主体长度超过 |
如果在此连接上使用了 GSSAPI 加密,则为真 |
27.2.9. pg_stat_archiver #
pg_stat_archiver 视图总是有一行,其中包含关于集簇的归档进程的数据。
表 27.19. pg_stat_archiver 视图
列类型 描述 |
|---|
已成功归档的 WAL 文件数 |
最近成功归档的 WAL 文件的名称 |
最近成功归档操作的时间 |
记录 WAL 文件归档失败次数 |
最近一次归档操作失败的 WAL 文件的名称 |
最近一次归档操作失败的时间 |
这些统计信息上次被重置的时间 |
27.2.10. pg_stat_bgwriter #
pg_stat_bgwriter 视图始终只有一行,包含整个集簇的全局数据。
表 27.20. pg_stat_bgwriter 视图
列类型 描述 |
|---|
已执行的计划检查点数 |
已执行的请求检查点数 |
检查点处理中将文件写入磁盘部分所花费的总时间,单位为毫秒 |
检查点处理中将文件同步到磁盘部分所花费的总时间,单位为毫秒 |
检查点期间写入的缓冲区数 |
后台写入器写入的缓冲区数量 |
后台写入器因写入了过多缓冲区而停止清理扫描的次数 |
后端直接写入的缓冲区数 |
后端必须自行执行 |
分配的缓冲区数量 |
这些统计信息上次被重置的时间 |
27.2.11. pg_stat_database #
pg_stat_database 视图将包含一行用于集簇中的每个数据库,加一行用于共享对象,显示数据库范围的统计信息。
表 27.21. pg_stat_database 视图
列类型 描述 |
|---|
该数据库的 OID,属于共享关系的对象为 0 |
这个数据库的名称,或者共享对象为 |
当前连接到此数据库的后端数,对于共享对象则为 |
此数据库中已提交的事务数 |
该数据库中已回滚的事务数 |
在该数据库中读取的磁盘块数 |
在缓冲区缓存中发现磁盘块、因而无需读取的次数(这里只统计 PostgreSQL 缓冲区缓存中的命中,不包括操作系统文件系统缓存中的命中) |
此数据库中的查询返回的行数 |
此数据库中的查询获取的行数 |
查询在该数据库中插入的行数 |
这个数据库中查询更新的行数 |
这个数据库中被查询删除的行数 |
由于与此数据库中的恢复冲突而被取消的查询数。(冲突只会发生在备库上;请参阅 |
这个数据库中查询创建的临时文件的数量。所有临时文件都将被计数,而不顾及临时文件为什么被创建(例如,排序或 hash 运算),也不考虑 log_temp_files 设置。 |
这个数据库中的查询写入临时文件的数据总量。所有临时文件都将被计数,而不考虑临时文件为什么被创建,也不考虑 log_temp_files 设置。 |
在此数据库中检测到的死锁数 |
在此数据库(或共享对象)中检测到的数据页校验和失败次数,如果未启用数据校验和则为 NULL。 |
在此数据库(或共享对象)中最后一次检测到数据页校验和失败的时间,如果未启用数据校验和则为 NULL。 |
在这个数据库中通过后端读取数据文件块所花费的时间,以毫秒为单位(如果启用了 track_io_timing,否则为零) |
在这个数据库中通过后端写数据文件块所花费的时间,以毫秒为单位(如果启用了 track_io_timing,否则为零) |
这些统计数据最后一次重置的时间 |
27.2.12. pg_stat_database_conflicts #
pg_stat_database_conflicts 视图为每个数据库包含一行,用来显示数据库范围内因与备库上的恢复过程冲突而被取消的查询统计信息。该视图只包含备库上的信息,因为这类冲突不会发生在主库上。
表 27.22. pg_stat_database_conflicts 视图
列类型 描述 |
|---|
数据库的 OID |
数据库的名称 |
这个数据库中由于删除表空间而取消的查询的数量 |
此数据库中由于锁定超时而被取消的查询数 |
此数据库中由于旧快照而取消的查询数 |
此数据库中由于缓冲区被钉住而被取消的查询数 |
此数据库中由于死锁而被取消的查询数 |
27.2.13. pg_stat_all_tables #
pg_stat_all_tables 视图将为当前数据库中的每一个表(包括 TOAST 表)包含一行,该行显示与对该表的访问相关的统计信息。pg_stat_user_tables 和 pg_stat_sys_tables 视图包含相同的信息,但是被过滤得分别只显示用户和系统表。
表 27.23. pg_stat_all_tables 视图
列类型 描述 |
|---|
表的 OID |
该表所在的模式的名称 |
这个表的名称 |
在此表上启动的顺序扫描数 |
顺序扫描获取的存活行数 |
对这个表发起的索引扫描数 |
索引扫描获取的存活行数 |
插入的行数 |
更新的行数(包括 HOT 更新的行) |
删除的行数 |
HOT 更新的行数(即不需要单独更新索引) |
活的行的估计数量 |
死行的估计数量 |
自上次分析此表以来修改的行的估计数量 |
自上次清理此表以来插入的行的估计数量 |
最后一次手动清理这个表的时间(不包括 |
这个表最后一次被自动清理守护进程清理的时间 |
上一次手动分析这个表的时间 |
自动清理守护进程最后一次分析这个表的时间 |
这个表被手动清理的次数( |
这个表被自动清理守护进程清理的次数 |
手动分析这个表的次数 |
这个表被自动清理守护进程分析的次数 |
27.2.14. pg_stat_all_indexes #
pg_stat_all_indexes 视图将为当前数据库中的每个索引包含一行,该行显示关于对该索引访问的统计信息。pg_stat_user_indexes 和 pg_stat_sys_indexes 视图包含相同的信息,但是被过滤得只分别显示用户和系统索引。
表 27.24. 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 统计从表取得的存活行。如果使用该索引取得了任何死亡行或还未提交的行,或者如果通过一次仅索引扫描的方式避免了任何堆获取,后者将较小。
27.2.15. pg_statio_all_tables #
pg_statio_all_tables 视图将为当前数据库中的每个表(包括 TOAST 表)包含一行,该行显示指定表上有关 I/O 的统计信息。pg_statio_user_tables 和 pg_statio_sys_tables 视图包含相同的信息,但是被过滤得分别只显示用户表和系统表。
表 27.25. pg_statio_all_tables 视图
列类型 描述 |
|---|
表的 OID |
该表所在的模式的名称 |
这个表的名称 |
从该表中读取的磁盘块的数量 |
该表中的缓冲区命中数 |
从这个表上所有索引读取的磁盘块数 |
这个表上所有索引中的缓冲区命中数 |
从这个表的 TOAST 表中读取的磁盘块的数量(如果有的话) |
这个表的 TOAST 表中的缓冲区命中数(如果有的话) |
从这个表的 TOAST 表索引中读取的磁盘块的数量(如果有的话) |
这个表的 TOAST 表索引中的缓冲区命中数(如果有的话) |
27.2.16. pg_statio_all_indexes #
pg_statio_all_indexes 视图将为当前数据库中的每个索引包含一行,该行显示指定索引上有关 I/O 的统计信息。pg_statio_user_indexes 和 pg_statio_sys_indexes 视图包含相同的信息,但是被过滤得分别只显示用户索引和系统索引。
表 27.26. pg_statio_all_indexes 视图
列类型 描述 |
|---|
对于此索引的表的 OID |
这个索引的 OID |
这个索引所在的模式名称 |
这个索引的表的名称 |
这个索引的名称 |
从此索引中读取的磁盘块的数量 |
此索引中的缓冲区命中数 |
27.2.17. pg_statio_all_sequences #
pg_statio_all_sequences 视图将为当前数据库中的每个序列包含一行,该行显示在指定序列上有关 I/O 的统计信息。
表 27.27. pg_statio_all_sequences 视图
列类型 描述 |
|---|
序列的 OID |
此序列所在的模式的名称 |
此序列的名称 |
从这个序列中读取的磁盘块的数量 |
在此序列中的缓冲区命中数 |
27.2.18. pg_stat_user_functions #
pg_stat_user_functions 视图将为每一个被追踪的函数包含一行,该行显示有关该函数执行的统计信息。track_functions 参数控制到底哪些函数被跟踪。
表 27.28. pg_stat_user_functions 视图
列类型 描述 |
|---|
函数的 OID |
这个函数所在的模式的名称 |
这个函数的名称 |
这个函数已经被调用的次数 |
在这个函数以及它所调用的其他函数中花费的总时间,以毫秒计 |
在这个函数本身花费的总时间,不包括被它调用的其他函数,以毫秒计 |
27.2.19. pg_stat_slru #
PostgreSQL 通过 SLRU(simple least-recently-used,简单最近最少使用)缓存访问某些磁盘上的信息。pg_stat_slru 视图将为每个被跟踪的 SLRU 缓存包含一行,显示关于访问缓存页面的统计信息。
表 27.29. pg_stat_slru 视图
列类型 描述 |
|---|
SLRU 的名称 |
初始化期间被置零的块数 |
已经在 SLRU 中的磁盘块被发现的次数,因此不需要读取(这只包括 SLRU 中的命中,而不是操作系统的文件系统缓存) |
为这个 SLRU 读取的磁盘块数 |
为这个 SLRU 写入的磁盘块数 |
为这个 SLRU 检查是否存在的块数 |
此 SLRU 的脏数据刷盘次数 |
这个 SLRU 的截断次数 |
这些统计信息上次被重置的时间 |
27.2.20. 统计函数 #
其他查看统计信息的方法是直接使用查询,这些查询使用上述标准视图用到的底层统计信息访问函数。如要了解如函数名等细节,可参考标准视图的定义(例如,在 psql 中你可以发出\d+ pg_stat_activity)。针对每一个数据库统计信息的访问函数把一个数据库 OID 作为参数来标识要报告哪个数据库。而针对每个表和每个索引的函数要求表或索引 OID。针对每个函数统计信息的函数用一个函数 OID。注意只有在当前数据库中的表、索引和函数才能被这些函数看到。
与统计收集器相关的其他功能在表 27.30 中列出。
表 27.30. 附加统计函数
警告
使用 pg_stat_reset() 还会重置自动清理使用的计数器,以确定何时触发清理或分析。重置这些计数器可能导致自动清理不执行必要的工作,这可能会导致问题,如表膨胀或过时的表统计信息。建议在统计信息重置后进行全库 ANALYZE。
pg_stat_get_activity 是 pg_stat_activity 视图的底层函数,它返回一个行集合,其中包含有关每个后端进程所有可用的信息。有时只获得该信息的一个子集可能会更方便。在那些情况中,可以使用一组更老的针对每个后端的统计访问函数,这些显示在表 27.31 中。这些访问函数使用一个后端 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;
表 27.31. 按后端统计函数
函数 描述 |
|---|
返回当前活动后端 ID 号的集合(从 1 到活动后端数)。 |
返回此后端最近查询的文本。 |
返回后端最近一次查询开始的时间。 |
返回连接到此后端的客户端的 IP 地址。 |
返回客户端用于通信的 TCP 端口号。 |
返回此后端连接的数据库的 OID。 |
返回此后端进程 ID。 |
返回该进程开始的时间。 |
返回登录到此后端的用户的 OID。 |
如果后端当前正在等待,则返回等待事件类型名称,否则返回空值。请参阅表 27.4。 |
返回后端当前事务开始的时间。 |