PostgreSQL 统计收集器
- 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. Statistics Functions
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
毫秒(缺省为 500ms,除非在编译服务器的时候修改过)发送一 次新的报告。因此显示的信息总是落后于实际活动。但是由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 的后端(包括autovacuum工作者进程)一行,显示当前的进度。详见第 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
|
当前数据库中的每个索引一行,显示:表OID、索引OID、模式名、表名、索引名、 使用了该索引的索引扫描总数、索引扫描返回的索引记录数、使用该索引的简 单索引扫描抓取的活表(livetable)中数据行数。 当前数据库中的每个索引一行,显示与访问指定索引有关的统计信息。详见本文章中的 pg_stat_all_indexes
。 |
pg_stat_sys_indexes
|
和pg_stat_all_indexes 一样,但只显示系统表上的索引。 |
pg_stat_user_indexes
|
和pg_stat_all_indexes 一样,但只显示用户表上的索引。 |
pg_statio_all_tables
|
当前数据库中每个表一行(包括TOAST表),显示:表OID、模式名、表名、 从该表中读取的磁盘块总数、缓冲区命中次数、该表上所有索引的磁盘块读取总数、 该表上所有索引的缓冲区命中总数、在该表的辅助TOAST表(如果存在)上的磁盘块读取总数、 在该表的辅助TOAST表(如果存在)上的缓冲区命中总数、TOAST表的索引的磁盘块读 取总数、TOAST表的索引的缓冲区命中总数。 当前数据库中的每个表一行,显示有关在指定表上 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
|
当前数据库中每个索引一行,显示:表OID、索引OID、模式名、 表名、索引名、该索引的磁盘块读取总数、该索引的缓冲区命中总数。 当前数据库中的每个索引一行,显示与指定索引上的 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
|
当前数据库中每个序列对象一行,显示:序列OID、模式名、序列名、序列的磁盘读取总数、序列的缓冲区命中总数。 当前数据库中的每个序列一行,显示与指定序列上的 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
|
对于所有跟踪功能,函数的OID,模式,名称,数量 通话总时间,和自我的时间。自我时间是 在函数本身所花费的时间量,总时间包括 它调用函数所花费的时间。时间值以毫秒为单位。 每一个被跟踪的函数一行,显示与执行该函数有关的统计信息。详见 本文章中的pg_stat_user_functions
。 |
pg_stat_xact_user_functions
|
和pg_stat_user_functions 相似,但是只统计在当前事务期间的调用(还没有被包括在pg_stat_user_functions 中)。 |
pg_stat_slru
|
每个SLRU一行, 显示操作的统计信息。参见本文章中的 pg_stat_slru
for details. |
针对每个索引的统计信息对于判断哪个索引正被使用以及它们的效果特别有用。
pg_statio_
系列视图主要用于判断缓冲区的效果。当实际磁盘读取数远小于缓冲区命中时,这个缓冲能满足大部分读请求而无需进行内核调用。但是,这些统计信息并没有给出所有的事情:由于PostgreSQL处理磁盘 I/O 的方式,不在PostgreSQL缓冲区中的数据库仍然驻留在内核的 I/O 缓存中,并且因此可以被再次读取而不需要物理磁盘读取。我们建议希望了解
PostgreSQLI/O 行为更多细节的用户将PostgreSQL统计收集器和操作系统中允许观察内核处理 I/O 的工具一起使用。
27.2.3. pg_stat_activity
pg_stat_activity
视图每个服务器进程将有一行,显示与该进程当前活动相关的信息。
表 27.3. pg_stat_activity
视图
列类型 描述 |
---|
这个后端连接到的数据库的OID |
这个后端连接到的数据库的名称 |
这个后端的进程 ID |
并行组组长的进程ID,如果该进程是并行查询工作者。如果该进程是一个并行组的组长或不参与并行查询,则为 |
登录到这个后端的用户的 OID |
登录到这个后端的用户的 OID |
连接到这个后端的应用的名称 |
连接到这个后端的客户端的 IP 地址。如果这个字段为空,它表示客户端通过服务器机器上的一个 Unix 套接字连接或者这是一个内部进程,如自动清理。 |
已连接的客户端的主机名,由 |
客户端用于与此后端通信的TCP端口号,如果使用Unix套接字,则为 |
这个进程被启动的时间。对客户端后端来说,这就是客户端连接到服务器的时间。 |
这个进程的当前事务被启动的时间,如果没有活动事务则为空。 如果当前查询是它的第一个事务,这一列等于 |
当前活动查询被开始的时间,如果 |
|
后端等待的事件类型,如果有的话;否则NULL。参见本文中表 27.4。 |
如果后端当前正在等待,则等待事件名称,否则为NULL。参见本文中表 27.5 到 本文中27.13。 |
这个后端的当前总体状态。可能的值为:
|
这个后端的顶层事务标识符,如果存在。 |
当前后端的 |
这个后端最近查询的文本。如果 |
当前后端的类型。可能的类型为 |
注意
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
|
等待用零填充动态共享内存备份(backing)文件。 |
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
|
在walsender时间线命令期间等待从时间线历史文件读取。 |
WALSync
|
等待WAL文件到达持久存储。 |
WALSyncMethodAssign
|
等待数据到达持久存储,同时分配一个新的WAL同步方法。 |
WALWrite
|
等待写入WAL文件。 |
表 27.10. IPC
类型的等待事件
IPC 等待事件 |
描述 |
---|---|
BackupWaitWalArchive
|
等待备份所需的WAL文件成功存档。 |
BgWorkerShutdown
|
等待后台工作者关闭。 |
BgWorkerStartup
|
等待后台工作者启动。 |
BtreePage
|
正等待继续并行B-树扫描所需的页号变得可用。 |
CheckpointDone
|
等待检查点完成。 |
CheckpointStart
|
等待检查点开始。 |
ExecuteGather
|
在执行Gather 计划节点时,等待子进程的活动。 |
HashBatchAllocate
|
等待一个选定的并行哈希参与者分配哈希表。 |
HashBatchElect
|
等待选择一个并行哈希参与者来分配哈希表。 |
HashBatchLoad
|
等待其他并行哈希参与者完成哈希表的加载。 |
HashBuildAllocate
|
等待一个选定的并行哈希参与者分配初始哈希表。 |
HashBuildElect
|
等待选择一个并行哈希参与者来分配初始哈希表。 |
HashBuildHashInner
|
等待其他并行哈希参与者完成内部关系的散列。 |
HashBuildHashOuter
|
等待其他Parallel 哈希参与者完成对外部关系的分区。 |
HashGrowBatchesAllocate
|
等待选定的并行哈希参与者分配更多批处理。 |
HashGrowBatchesDecide
|
等待选择一个并行哈希参与者来决定未来的批处理增长。 |
HashGrowBatchesElect
|
等待选择一个Parallel 哈希参与者来分配更多批处理。 |
HashGrowBatchesFinish
|
Waiting for an elected Parallel Hash participant to decide on future batch growth. |
HashGrowBatchesRepartition
|
等待一个选定的并行哈希参与者决定未来的批处理增长。 |
HashGrowBucketsAllocate
|
等待选定的并行哈希参与者完成更多bucket的分配。 |
HashGrowBucketsElect
|
等待选择一个并行哈希参与者来分配更多的buckets。 |
HashGrowBucketsReinsert
|
等待其他Parallel 哈希参与者完成将元组插入到新buckets中。 |
LogicalSyncData
|
等待逻辑复制远程服务器发送用于初始表同步的数据。 |
LogicalSyncStateChange
|
等待逻辑复制远程服务器更改状态。 |
MessageQueueInternal
|
等待另一个进程附加到共享消息队列。 |
MessageQueuePutMessage
|
等待将协议消息写入共享消息队列。 |
MessageQueueReceive
|
等待从共享消息队列接收字节。 |
MessageQueueSend
|
等待将字节发送到共享消息队列。 |
ParallelBitmapScan
|
等待并行位图扫描被初始化。 |
ParallelCreateIndexScan
|
等待并行CREATE INDEX 工作者完成堆扫描。 |
ParallelFinish
|
等待并行工作人员完成计算。 |
ProcArrayGroupUpdate
|
等待组领导在并行操作结束时清除事务ID。 |
ProcSignalBarrier
|
等待屏障事件被所有后端处理。 |
Promote
|
等待备用系统提升。 |
RecoveryConflictSnapshot
|
等待vacuum清理的恢复冲突解决。 |
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
|
等待读取或更新关于“heavyweight”锁。 |
LogicalRepWorker
|
等待读取或更新逻辑复制工作器的状态。 |
MultiXactGen
|
等待读取或更新共享的multixact状态。 |
MultiXactMemberBuffer
|
在multixact成员SLRU缓冲区上等待I/O。 |
MultiXactMemberSLRU
|
等待访问multixact成员SLRU缓存。 |
MultiXactOffsetBuffer
|
在multixact 偏移 SLRU缓冲区上等待I/O。 |
MultiXactOffsetSLRU
|
等待访问multixact 偏移 SLRU缓存。 |
MultiXactTruncation
|
等待读取或截断multixact信息。 |
NotifyBuffer
|
在NOTIFY 消息 SLRU缓冲区上等待I/O。 |
NotifyQueue
|
等待读取或更新NOTIFY 消息。 |
NotifyQueueTail
|
等待NOTIFY 消息存储上的更新限制。 |
NotifySLRU
|
等待访问NOTIFY 消息SLRU缓存。 |
OidGen
|
等待分配一个新的OID。 |
OldSnapshotTimeMap
|
等待读取或更新旧的快照控制信息。 |
ParallelAppend
|
在并行附加计划执行期间等待选择下一个子计划。 |
ParallelHashJoin
|
在并行哈希连接计划执行期间等待同步工作器。 |
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和multixact消费的限制。 |
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 ,存档或流)获得时,在恢复期间等待。 |
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与接收到后备服务器已经写入它、刷写它并且应用它的通知之间流逝的时间。 如果这台服务器被配置为一个同步后备,这可以用来计量在提交时 |
在基于优先的同步复制中,这台后备服务器被选为同步后备的优先级。在基于规定数量的同步复制中,这个值没有效果。 |
这一台后备服务器的同步状态。 可能的值是:
|
从备用服务器收到的最后一条回复信息的发送时间 |
pg_stat_replication
视图中报告的滞后时间近期的WAL被写入、刷写并且重放以及发送器知道这一切所花的时间的度量。如果远程服务器被配置为一台同步后备,这些时间表示由每一种同步提交级别所带来(或者是可能带来)的提交延迟。对于一台异步后备,replay_lag
列是最近的事务变得对查询可见的延迟时间的近似值。如果后备服务器已经完全追上了发送服务器并且没有WAL活动,在短时间内将继续显示最近测到的滞后时间,再然后就会显示为NULL。
对于物理复制会自动测量滞后时间。逻辑解码插件可能会选择性地发出跟踪消息,如果它们没有这样做,跟踪机制将把滞后显示为NULL。
注意
报告的滞后时间并非按照当前的重放速率该后备还有多久才能追上发送服务器的预测。在新的WAL被生成期间,这样一种系统将显示类似的时间,但是当发送器变为闲置时会显示不同的值。特别是当后备服务器完全追上时,pg_stat_replication
显示的是写入、刷写及重放最近报告的WAL位置所花的时间而不是一些用户可能预期的零。这种做法与为近期的写事务测量同步提交和事务可见性延迟的目的一致。为了降低用户预期一种不同的滞后模型带来的混淆,在一个完全重放完的闲置系统上,lag列会在一段比较短的时间后回复成NULL。监控系统应该选择将这种情况表示为缺失数据、零或者继续显示最近的已知值。
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
View
列类型 描述 |
---|
订阅的OID |
订阅的名称 |
订阅工作者进程的进程ID |
工作器正在同步的关系的OID;Null用于主应用工作器 |
接收到的最后一个预写式日志位置,该字段的初始值为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则为NULL |
正在使用的SSL密码的名称,如果此连接上没有使用SSL则为NULL |
使用的加密算法中的位数,如果此连接上没有使用SSL则为NULL |
如果使用SSL压缩则为真,否则为假,如果此连接未使用SSL则为NULL |
区别名称(DN,Distinguished Name)字段与使用的客户端证书,如果没有提供客户端证书或在此连接上没有使用SSL,则为NULL。 如果DN字段长于 |
客户端证书的序列号,如果没有提供客户端证书或在此连接上没有使用SSL,则为NULL。 证书序列号和证书颁发者的组合唯一标识一个证书(除非颁发者错误地重用序列号)。 |
客户端证书颁发者的区别名称(DN,Distinguished Name),如果没有提供客户端证书或在此连接上没有使用SSL,则为NULL。该字段像 |
27.2.8. pg_stat_gssapi
pg_stat_gssapi
视图将包含每一个后端一个行,显示该连接上的GSSAPI使用情况。 它可以加入到pg_stat_activity
或pg_stat_replication
上的pid
列,获取更多关于连接的详细信息。
表 27.18. pg_stat_gssapi
视图
列类型 描述 |
---|
后端进程ID |
如果此连接使用了GSSAPI身份验证,则为True |
用于验证此连接的主体,如果未使用GSSAPI对此连接进行身份验证,则为NULL。 如果主体长度超过 |
如果在此连接上使用了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
View
列类型 描述 |
---|
已执行的预定检查点数 |
请求已执行的检查点数 |
检查点处理中将文件写入磁盘的部分所花费的总时间,以毫秒为单位 |
检查点处理中将文件同步到磁盘的部分所花费的总时间,以毫秒为单位 |
检查点期间写入的缓冲区数 |
后台写入器写入的缓冲区数 |
后台写入器因为写入太多缓冲区而停止清理扫描的次数 |
后端直接写入的缓冲区数 |
后端必须执行自己的 |
分配的缓冲区数 |
这些统计数据最后一次重置的时间 |
27.2.11. pg_stat_database
pg_stat_database
视图将包含一行用于集群中的每个数据库,加一行用于共享对象,显示数据库范围的统计信息。
表 27.21. pg_stat_database
视图
列类型 描述 |
---|
该数据库的OID,属于共享关系的对象为0 |
这个数据库的名称,或者共享对象为 |
当前连接到此数据库的后端数,对于共享对象则为 |
此数据库中已提交的事务数 |
该数据库中已回滚的事务数 |
在该数据库中读取的磁盘块数 |
在缓存中发现磁盘块的次数,因此读取不是必需的(这只包括在PostgreSQL缓存中,而不是在操作系统的文件系统缓存中) |
这个数据库中查询返回的行数 |
这个数据库中查询获取的行数 |
查询在该数据库中插入的行数 |
这个数据库中查询更新的行数 |
这个数据库中被查询删除的行数 |
由于与此数据库中的恢复冲突而取消的查询数。(冲突只发生在备用服务器上;详请参见本文中 |
这个数据库中查询创建的临时文件的数量。所有临时文件都将被计数,而不顾及临时文件为什么被创建(例如,排序或散列),也不考虑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更新的行数(即,不需要单独的索引更新) |
活的行的估计数量 |
僵死行的估计数量 |
自上次分析此表以来修改的行的估计数量 |
自上次清空此表以来插入的行的估计数量 |
最后一次手动清理这个表(不包括 |
这个表最后一次被自动清理守护进程清理的时间 |
上一次手动分析这个表 |
自动清理守护进程最后一次分析这个表 |
这个表被手动清理的次数( |
这个表被autovacuum守护进程清理的次数 |
手动分析这个表的次数 |
这个表被autovacuum守护进程分析的次数 |
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. Statistics Functions
其他查看统计信息的方法是直接使用查询,这些查询使用上述标准视图用到的底层统计信息访问函数。 如要了解如函数名等细节,可参考标准视图的定义(例如,在psql中你可以发出d+ pg_stat_activity
)。 针对每一个数据库统计信息的访问函数把一个数据库 OID 作为参数来标识要报告哪个数据库。而针对每个表和每个索引的函数要求表或索引 OID。 针对每个函数统计信息的函数用一个函数
OID。注意只有在当前数据库中的表、索引和函数才能被这些函数看到。
更多统计集合的函数列在 表 27.30中.
表 27.30. Additional Statistics Functions
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. Per-Backend Statistics Functions