28.2. 统计收集器

PostgreSQL统计收集器是一个支持收集和报告服务器活动信息的子系统。 目前,这个收集器可以对表和索引的访问计数,计数可以按磁盘块和个体行来进行。它还跟踪每个表中的总行数、每个表的清理和分析动作的信息。它也统计调用用户定义函数的次数以及在每次调用中花费的总时间。

PostgreSQL也支持报告有关系统正在干什么的 动态信息,例如当前正在被其他服务器进程执行的命令以及系统中存在哪些其他连接。 这个功能是独立于收集器进程存在的。

28.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子目录中,这样在服务器重启后统计信息能被保持。当在服务器启动时执行恢复时(例如立即关闭、服务器崩溃以及时间点恢复之后),所有统计计数器会被重置。

28.2.2. 查看统计信息

表 28-1中列出了一些预定义视图 可以用来显示系统的当前状态。 表 28-2中列出了另一些视图可以 显示统计收集的结果。你也可以使用底层统计函数(在 第 28.2.3 节中讨论)来建立自定义的视图。

在使用统计信息监控收集到的数据时,你必须了解这些信息并非是实时更新的。每个独立的服务器进程只在进入闲置状态之前才向收集器传送新的统计计数;因此正在进行的查询或事务并不影响显示出来的总数。同样,收集器本身也最多每PGSTAT_STAT_INTERVAL毫秒(缺省为 500ms,除非在编译服务器的时候修改过)发送一 次新的报告。因此显示的信息总是落后于实际活动。但是由track_activities收集的当前查询信息总是最新的。

另一个重点是当一个服务器进程被要求显示任何这些统计信息时,它首先取得收集器进程最近发出的报告并且接着为所有统计视图和函数使用这个快照,直到它的当前事务的结尾。因此只要你继续当前事务,统计数据将会一直显示静态信息。相似地,当任何关于所有会话的当前查询的信息在一个事务中第一次被请求时,这样的信息将被收集。并且在整个事务期间将显示相同的信息。这是一种特性而非缺陷,因为它允许你在该统计信息上执行多个查询并且关联结果而不用担心那些数字会在你不知情的情况下改变。但是如果你希望用每个查询都看到新结果,要确保在任何事务块之外做那些查询。或者,你可以调用pg_stat_clear_snapshot(),那将丢弃当前事务的统计快照(如果有)。下一次对统计性信息的使用将导致获取一个新的快照。

一个事务也可以在视图pg_stat_xact_all_tablespg_stat_xact_sys_tablespg_stat_xact_user_tablespg_stat_xact_user_functions中看到它自己的统计信息(还没有被传送给收集器)。这些数字并不像上面所述的那样行动,相反它们在事务期间持续被更新。

表 28-1. 动态统计视图

视图名称描述
pg_stat_activity 每个服务器进程一行,显示与那个进程的当前活动相关的信息,例如状态和当前查询。详见pg_stat_activity
pg_stat_replication每一个 WAL 发送进程一行,显示有关到该发送进程 连接的后备服务器的复制的统计信息。详见 pg_stat_replication
pg_stat_wal_receiver只有一行,显示来自 WAL 接收器所连接服务器的有关该接收器的统计信息。详见pg_stat_wal_receiver
pg_stat_ssl每个连接(常规连接和复制连接)一行, 显示有关在此连接上使用的 SSL 的信息。 详见pg_stat_ssl

表 28-2. 已收集统计信息的视图

视图名称描述
pg_stat_archiver只有一行,显示有关 WAL 归档进程活动的统计信息。详见pg_stat_archiver
pg_stat_bgwriter只有一行,显示有关后台写进程的活动的统计信息。详见pg_stat_bgwriter
pg_stat_database每个数据库一行,显示数据库范围的统计信息。详见pg_stat_database
pg_stat_database_conflicts 每个数据库一行,显示数据库范围的统计信息, 这些信息的内容是关于由于与后备服务器的恢复过程 发生冲突而被取消的查询。详见 pg_stat_database_conflicts
pg_stat_all_tables 当前数据库中每个表一行,显示有关访问指定表的统计信息。详见pg_stat_all_tables
pg_stat_sys_tablespg_stat_all_tables一样,但只显示系统表。
pg_stat_user_tablespg_stat_all_tables一样,但只显示用户表。
pg_stat_xact_all_tablespg_stat_all_tables相似,但计数动作只在当前事务内发生(还没有被包括在pg_stat_all_tables和相关视图中)。用于生存和死亡行数量的列以及清理和分析动作在此视图中不出现。
pg_stat_xact_sys_tablespg_stat_xact_all_tables一样,但只显示系统表。
pg_stat_xact_user_tablespg_stat_xact_all_tables一样,但只显示用户表。
pg_stat_all_indexes 当前数据库中的每个索引一行,显示:表OID、索引OID、模式名、表名、索引名、 使用了该索引的索引扫描总数、索引扫描返回的索引记录数、使用该索引的简 单索引扫描抓取的活表(livetable)中数据行数。 当前数据库中的每个索引一行,显示与访问指定索引有关的统计信息。详见pg_stat_all_indexes
pg_stat_sys_indexespg_stat_all_indexes一样,但只显示系统表上的索引。
pg_stat_user_indexespg_stat_all_indexes一样,但只显示用户表上的索引。
pg_statio_all_tables 当前数据库中每个表一行(包括TOAST表),显示:表OID、模式名、表名、 从该表中读取的磁盘块总数、缓冲区命中次数、该表上所有索引的磁盘块读取总数、 该表上所有索引的缓冲区命中总数、在该表的辅助TOAST表(如果存在)上的磁盘块读取总数、 在该表的辅助TOAST表(如果存在)上的缓冲区命中总数、TOAST表的索引的磁盘块读 取总数、TOAST表的索引的缓冲区命中总数。 当前数据库中的每个表一行,显示有关在指定表上 I/O 的统计信息。详见pg_statio_all_tables
pg_statio_sys_tablespg_statio_all_tables一样,但只显示系统表。
pg_statio_user_tablespg_statio_all_tables一样,但只显示用户表。
pg_statio_all_indexes 当前数据库中每个索引一行,显示:表OID、索引OID、模式名、 表名、索引名、该索引的磁盘块读取总数、该索引的缓冲区命中总数。 当前数据库中的每个索引一行,显示与指定索引上的 I/O 有关的统计信息。详见pg_statio_all_indexes
pg_statio_sys_indexespg_statio_all_indexes一样,但只显示系统表上的索引。
pg_statio_user_indexespg_statio_all_indexes一样,但只显示用户表上的索引。
pg_statio_all_sequences 当前数据库中每个序列对象一行,显示:序列OID、模式名、序列名、序列的磁盘读取总数、序列的缓冲区命中总数。 当前数据库中的每个序列一行,显示与指定序列上的 I/O 有关的统计信息。详见pg_statio_all_sequences
pg_statio_sys_sequencespg_statio_all_sequences一样,但只显示系统序列(目前没有定义系统序列,因此这个视图总是为空)。
pg_statio_user_sequencespg_statio_all_sequences一样,但只显示用户序列。
pg_stat_user_functions 对于所有跟踪功能,函数的OID,模式,名称,数量 通话总时间,和自我的时间。自我时间是 在函数本身所花费的时间量,总时间包括 它调用函数所花费的时间。时间值以毫秒为单位。 每一个被跟踪的函数一行,显示与执行该函数有关的统计信息。详见pg_stat_user_functions
pg_stat_xact_user_functionspg_stat_user_functions相似,但是只统计在当前事务期间的调用(还没有被包括在pg_stat_user_functions中)。
pg_stat_progress_vacuum每个运行VACUUM的后端(包括自动清理工作者进程)一行,显示当前的进度。见第 28.4.1 节

针对每个索引的统计信息对于判断哪个索引正被使用以及它们的效果特别有用。

pg_statio_系列视图主要用于判断缓冲区的效果。当实际磁盘读取数远小于缓冲区命中时,这个缓冲能满足大部分读请求而无需进行内核调用。但是,这些统计信息并没有给出所有的事情:由于PostgreSQL处理磁盘 I/O 的方式,不在PostgreSQL缓冲区中的数据库仍然驻留在内核的 I/O 缓存中,并且因此可以被再次读取而不需要物理磁盘读取。我们建议希望了解PostgreSQL I/O 行为更多细节的用户将PostgreSQL统计收集器和操作系统中允许观察内核处理 I/O 的工具一起使用。

表 28-3. pg_stat_activity 视图

类型描述
datidoid这个后端连接到的数据库的OID
datnamename这个后端连接到的数据库的名称
pidinteger这个后端的进程 ID
usesysidoid登录到这个后端的用户的 OID
usenamename登录到这个后端的用户的名称
application_nametext连接到这个后端的应用的名称
client_addrinet连接到这个后端的客户端的 IP 地址。如果这个域为空,它表示客户端通过服务器机器上的一个 Unix 套接字连接或者这是一个内部进程(如自动清理)。
client_hostnametext已连接的客户端的主机名,由client_addr的反向 DNS 查找报告。这个域将只对 IP 连接非空,并且只有log_hostname被启用时才会非空。
client_portinteger客户端用以和这个后端通信的 TCP 端口号,如果使用 Unix 套接字则为-1
backend_starttimestamp with time zone这个进程被启动的时间,即客户端是什么时候连接到服务器的
xact_starttimestamp with time zone这个进程的当前事务被启动的时间,如果没有活动事务则为空。如果当前查询是它的第一个事务,这一列等于query_start
query_starttimestamp with time zone当前活动查询被开始的时间,如果state不是active,这个域为上一个查询被开始的时间
state_changetimestamp with time zonestate上一次被改变的时间
wait_event_typetext后端正在等待的事件类型,如果不存在则为 NULL。可能的值有:

  • LWLockNamed:后端正在等待一个特定命名的轻量级锁。每一个这样的锁保护共享内存中的一个特定数据结构。wait_event将包含该轻量级锁的名称。

  • LWLockTranche:后端正在等待一组相关轻量级锁中的一个。该组中的所有锁都执行一种相似的功能。wait_event将标识这个组中锁的大体目的。

  • Lock:后端正在等待一个重量级锁。重量级锁,也称为锁管理器锁或者简单锁,主要保护 SQL 可见的对象,例如表。不过,它们也被用于确保特定内部操作的互斥,例如关系扩展。wait_event将标识等待的锁的类型。

  • BufferPin:服务器进程正在等待访问一个数据缓冲区,而此时没有其他进程正在检查该缓冲区。如果另一个进程持有一个最终从要访问的缓冲区中读取数据的打开的游标,缓冲区 pin 等待可能会被拖延。

wait_eventtext如果后端当前正在等待,则是等待事件的名称,否则为 NULL。详见表 28-4
statetext这个后端的当前总体状态。可能的值是:

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

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

  • idle in transaction:后端在一个事务中,但是当前没有正在执行一个查询。

  • idle in transaction (aborted):这个状态与idle in transaction相似,不过在该事务中的一个语句导致了一个错误。

  • fastpath function call:后端正在执行一个 fast-path 函数。

  • disabled:如果在这个后端中track_activities被禁用,则报告这个状态。

backend_xidxid这个后端的顶层事务标识符(如果存在)。
backend_xminxid当前后端的xmin范围。
querytext这个后端最近查询的文本。如果stateactive,这个域显示当前正在执行的查询。在所有其他状态下,它显示上一个被执行的查询。

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

注意: wait_eventstate列是独立的。如果一个后端处于active状态,它可能是也可能不是某个事件上的waiting。如果状态是active并且wait_event为非空,它意味着一个查询正在被执行,但是它被阻塞在系统中某处。

表 28-4. wait_event 描述

等待事件类型等待事件名称描述
LWLockNamedShmemIndexLock正等待在共享内存中查找或者分配空间。
OidGenLock正等待分配或者赋予一个 OID。
XidGenLock正等待分配或者赋予一个事务 ID。
ProcArrayLock正等待在事务结尾得到一个快照或者清除事务 ID。
SInvalReadLock正等待从共享无效消息队列中检索或者移除消息。
SInvalWriteLock正等待在共享无效消息队列中增加一个消息。
WALBufMappingLock正等待在 WAL 缓冲区中替换一个页面。
WALWriteLock正等待 WAL 缓冲区被写入到磁盘。
ControlFileLock正等待读取或者更新控制文件或创建一个新的 WAL 文件。
CheckpointLock正等待执行检查点。
CLogControlLock正等待读取或者更新事务状态。
SubtransControlLock正等待读取或者更新子事务信息。
MultiXactGenLock正等待读取或者更新共享多事务状态。
MultiXactOffsetControlLock正等待读取或者更新多事务偏移映射。
MultiXactMemberControlLock正等待读取或者更新多事务成员映射。
RelCacheInitLock正等待读取或者写入关系缓冲区初始化文件。
CheckpointerCommLock正等待管理 fsync 请求。
TwoPhaseStateLock正等待读取或者更新预备事务的状态。
TablespaceCreateLock正等待创建或者删除表空间。
BtreeVacuumLock正等待读取或者更新一个 B-树索引的 vacuum 相关的信息。
AddinShmemInitLock正等待管理共享内存中的空间分配。
AutovacuumLock自动清理工作者或者启动器正等待更新或者读取自动清理工作者的当前状态。
AutovacuumScheduleLock正等待确认选中进行清理的表仍需要清理。
SyncScanLock正等待为同步扫描得到一个表上扫描的开始位置。
RelationMappingLock正等待更新用来存储目录到文件节点映射的关系映射文件。
AsyncCtlLock正等待读取或者更新共享通知状态。
AsyncQueueLock正等待读取或者更新通知消息。
SerializableXactHashLock正等待检索或者存储有关可序列化事务的信息。
SerializableFinishedListLock正等待访问已结束可序列化事务的列表。
SerializablePredicateLockListLock正等待在由可序列化事务持有的所列表上执行一个操作。
OldSerXidLock正等待读取或者记录冲突的可序列化事务。
SyncRepLock正等待读取或者更新有关同步复制的信息。
BackgroundWorkerLock正等待读取或者更新后台工作者状态。
DynamicSharedMemoryControlLock正等待读取或者更新动态共享内存状态。
AutoFileLock正等待更新postgresql.auto.conf文件。
ReplicationSlotAllocationLock正等待分配或者释放一个复制槽。
ReplicationSlotControlLock正等待读取或者更新复制槽状态。
CommitTsControlLock正等待读取或者更新事务提交时间戳。
CommitTsLock正等待读取或者更新事务时间戳的最新设置值。
ReplicationOriginLock正等待设置、删除或者使用复制源头。
MultiXactTruncationLock正等待读取或者阶段多事务信息。
OldSnapshotTimeMapLock正等待读取或者更新旧的快照控制信息。
LWLockTrancheclog正等待一个 clog(事务状态)缓冲区上的 I/O。
commit_timestamp正等待提交时间戳缓冲区上的 I/O。
subtrans正等待子事务缓冲区上的 I/O。
multixact_offset正等待多事务偏移缓冲区上的 I/O。
multixact_member正等待多事务成员缓冲区上的 I/O。
async正等待 async(通知)缓冲区上的 I/O。
oldserxid正等待 oldserxid 缓冲区上的 I/O。
wal_insert正等待把 WAL 插入到一个内存缓冲区。
buffer_content正等待读取或者写入内存中的一个数据页。
buffer_io正等待一个数据页面上的 I/O。
replication_origin正等待读取或者更新复制进度。
replication_slot_io正等待一个复制槽上的 I/O。
proc正等待读取或者更新 fast-path 锁信息。
buffer_mapping正等待把一个数据块与缓冲池中的一个缓冲区关联。
lock_manager正等待增加或者检查用于后端的锁,或者正等待加入或者退出一个锁定组(并行查询使用)。
predicate_lock_manager正等待增加或者检查谓词锁信息。
Lockrelation正等待获得一个关系上的锁。
extend正等待扩展一个关系。
page正等待获得一个关系上的页面的锁。
tuple正等待获得一个元组上的锁。
transactionid正等待一个事务结束。
virtualxid正等待获得一个虚拟 xid 锁。
speculative token正等待获取一个 speculative insertion lock。
object正等待获得一个非关系数据库对象上的锁。
userlock正等待获得一个用户锁。
advisory正等待获得一个咨询用户锁。
BufferPinBufferPin正等待在一个缓冲区上加 pin。

注意: 对于扩展安装的切片(tranche),这个名称由扩展指定并且会被wait_event显示出来。很有可能在其他后端不知道的情况下,用户在其中一个后端中注册了切片(通过在动态共享内存中分配),那么我们对这种情况会显示extension

下面的例子展示了如何查看等待事件

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 | LWLockNamed     | ProcArrayLock
(2 rows)

表 28-5. pg_stat_replication 视图

类型描述
pidinteger一个 WAL 发送进程的进程 ID
usesysidoid登录到这个 WAL 发送进程的用户的 OID
usenamename登录到这个 WAL 发送进程的用户的名称
application_nametext连接到这个 WAL 发送进程的应用的名称
client_addrinet连接到这个 WAL 发送进程的客户端的 IP 地址。 如果这个域为空,它表示该客户端通过服务器机器上的一个 Unix 套接字连接。
client_hostnametext连接上的客户端的主机名,由一次对client_addr 的逆向 DNS 查找报告。这个域将只对 IP 连接非空,并且只有在 log_hostname被启用时非空
client_portinteger客户端用来与这个 WAL 发送进程通讯的 TCP 端口号, 如果使用 Unix 套接字则为-1
backend_starttimestamp with time zone这个进程开始的时间,即客户端是何时连接到这个 WAL 发送进程的
backend_xminxidhot_standby_feedback报告 的这个后备机的xmin水平线。
statetext当前的 WAL 发送进程状态
sent_locationpg_lsn在这个连接上发送的最后一个事务日志的位置
write_locationpg_lsn被这个后备服务器写入到磁盘的最后一个事务日志的位置
flush_locationpg_lsn被这个后备服务器刷入到磁盘的最后一个事务日志的位置
replay_locationpg_lsn被重放到这个后备服务器上的数据库中的最后一个事务日志的位置
sync_priorityinteger这个后备服务器被选中为同步后备服务器的优先级
sync_statetext这个后备服务器的同步状态

pg_stat_replication视图中将为每一个 WAL 发送进程包含一行,用来显示与该发送进程连接的后备服务器的复制统计信息。 这个视图中只会列出直接连接的后备机,下游后备服务器的信息不包含在此。

表 28-6. pg_stat_wal_receiver 视图

类型描述
pidintegerWAL 接收器进程的进程 ID
statustextWAL 接收器进程的活动状态
receive_start_lsnpg_lsnWAL 接收器启动时使用的第一个事务日志位置
receive_start_tliintegerWAL 接收器启动时使用的第一个时间线编号
received_lsnpg_lsn已经接收到并且已经被杀入磁盘的最后一个事务日志的位置,这个域的初始值是 WAL 接收器启动时使用的第一个日志位置
received_tliinteger已经接收到并且已经被杀入磁盘的最后一个事务日志的时间线编号,这个域的初始值是 WAL 接收器启动时使用的第一个日志所在的时间线编号
last_msg_send_timetimestamp with time zone从源头 WAL 发送器接收到的最后一个消息的发送时间
last_msg_receipt_timetimestamp with time zone从源头 WAL 发送器接收到的最后一个消息的接收时间
latest_end_lsnpg_lsn报告给源头 WAL 发送器的最后一个事务日志位置
latest_end_timetimestamp with time zone报告给源头 WAL 发送器最后一个事务日志位置的时间
slot_nametext这个 WAL 接收器使用的复制槽的名称
conninfotext 这个 WAL 接收器使用的连接串,安全相关的域会被隐去。

pg_stat_wal_receiver事务只包含一行,它显示了从 WAL 接收器所连接的服务器得到的有关该接收器的统计信息。

表 28-7. pg_stat_ssl 视图

类型描述
pidinteger一个后端或者 WAL 发送进程的进程 ID
sslboolean如果在这个连接上使用了 SSL 则为真
versiontext在用的 SSL 版本,如果这个连接上没有使用 SSL 则为 NULL
ciphertext在用的 SSL 密码的名称,如果这个连接上没有使用 SSL 则为 NULL
bitsinteger使用的加密算法中的位数,如果这个连接上没有使用 SSL 则为 NULL
compressionboolean如果使用了 SSL 压缩则为真,否则为假, 如果这个连接上没有使用 SSL 则为 NULL
clientdntext来自所使用的客户端证书的识别名(DN)域, 如果没有提供客户端证书或者这个连接上没有使用 SSL 则为 NULL。如果 DN 域长度超过 NAMEDATALEN(标准编译 中是 64 个字符),则它会被截断。

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

表 28-8. pg_stat_archiver视图

类型描述
archived_countbigint已被成功归档的 WAL 文件数量
last_archived_waltext最后一个被成功归档的 WAL 文件名称
last_archived_timetimestamp with time zone最后一次成功归档操作的时间
failed_countbigint失败的归档 WAL 文件尝试的数量
last_failed_waltext最后一次失败的归档操作的 WAL 文件名称
last_failed_timetimestamp with time zone最后一次失败的归档操作的时间
stats_resettimestamp with time zone这些统计信息最后一次被重置的时间

The pg_stat_archiver视图将总是一个单一的行, 该行包含着有关集簇的归档进程的数据。

表 28-9. pg_stat_bgwriter视图

类型描述
checkpoints_timedbigint已经被执行的计划中检查点的数量
checkpoints_reqbigint已经被执行的请求检查点的数量
checkpoint_write_timedouble precision在文件被写入磁盘的检查点处理部分花费的总时间,以毫秒计
checkpoint_sync_timedouble precision在文件被同步到磁盘中的检查点处理部分花费的总时间,以毫秒计
buffers_checkpointbigint在检查点期间被写的缓冲区数目
buffers_cleanbigint被后台写进程写的缓冲区数目
maxwritten_cleanbigint后台写进程由于已经写了太多缓冲区而停止清洁扫描的次数
buffers_backendbigint被一个后端直接写的缓冲区数量
buffers_backend_fsyncbigint一个后端不得不自己执行fsync调用的次数(通常即使后端自己进行写操作,后台写进程也会处理这些)
buffers_allocbigint被分配的缓冲区数量
stats_resettimestamp with time zone这些统计信息上次被重置的时间

pg_stat_bgwriter视图将总是只有单独的一行,它包含集簇的全局数据。

表 28-10. pg_stat_database视图

类型描述
datidoid一个数据库的 OID
datnamename这个数据库的名称
numbackendsinteger当前连接到这个数据库的后端数量。这是在这个视图中唯一一个返回反映当前状态值的列。所有其他列返回从上次重置以来积累的值。
xact_commitbigint在这个数据库中已经被提交的事务的数量
xact_rollbackbigint在这个数据库中已经被回滚的事务的数量
blks_readbigint在这个数据库中被读取的磁盘块的数量
blks_hitbigint磁盘块被发现已经在缓冲区中的次数,这样不需要一次读取(这只包括 PostgreSQL 缓冲区中的命中,而不包括在操作系统文件系统缓冲区中的命中)
tup_returnedbigint在这个数据库中被查询返回的行数
tup_fetchedbigint在这个数据库中被查询取出的行数
tup_insertedbigint在这个数据库中被查询插入的行数
tup_updatedbigint在这个数据库中被查询更新的行数
tup_deletedbigint在这个数据库中被查询删除的行数
conflictsbigint由于与恢复冲突而在这个数据库中被取消的查询的数目(冲突只发生在后备服务器上,详见pg_stat_database_conflicts)。
temp_filesbigint在这个数据库中被查询创建的临时文件的数量。所有临时文件都被统计,不管为什么创建这些临时文件(如排序或哈希),并且不管log_temp_files设置。
temp_bytesbigint在这个数据库中被查询写到临时文件中的数据总量。所有临时文件都被统计,不管为什么创建这些临时文件(如排序或哈希),并且不管log_temp_files设置。
deadlocksbigint在这个数据库中被检测到的死锁数
blk_read_timedouble precision在这个数据库中后端花费在读取数据文件块的时间,以毫秒计
blk_write_timedouble precision在这个数据库中后端花费在写数据文件块的时间,以毫秒计
stats_resettimestamp with time zone这些统计信息上次被重置的时间

pg_stat_database视图将为集簇中的每一个数据库包含有一行,每一行显示数据库范围的统计信息。

表 28-11. pg_stat_database_conflicts 视图

类型描述
datidoid一个数据库的 OID
datnamename这个数据库的名称
confl_tablespacebigint这个数据库中由于表空间被删掉而取消的查询数量
confl_lockbigint这个数据库中由于锁超时而取消的查询数量
confl_snapshotbigint这个数据库中由于旧快照而取消的查询数量
confl_bufferpinbigint这个数据库中由于被占用的缓冲区而取消的查询数量
confl_deadlockbigint这个数据库中由于死锁而取消的查询数量

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

表 28-12. pg_stat_all_tables视图

类型描述
relidoid一个表的 OID
schemanamename这个表所在的模式的名称
relnamename这个表的名称
seq_scanbigint在这个表上发起的顺序扫描的次数
seq_tup_readbigint被顺序扫描取得的活着的行的数量
idx_scanbigint在这个表上发起的索引扫描的次数
idx_tup_fetchbigint被索引扫描取得的活着的行的数量
n_tup_insbigint被插入的行数
n_tup_updbigint被更新的行数(包括 HOT 更新的行)
n_tup_delbigint被删除的行数
n_tup_hot_updbigint被更新的 HOT 行数(即不要求独立索引更新的行更新)
n_live_tupbigint活着的行的估计数量
n_dead_tupbigint死亡行的估计数量
n_mod_since_analyzebigint从这个表最后一次被分析后备修改的行的估计数量
last_vacuumtimestamp with time zone上次这个表被手动清理的时间(不统计VACUUM FULL
last_autovacuumtimestamp with time zone上次这个表被自动清理守护进程清理的时间
last_analyzetimestamp with time zone上次这个表被手动分析的时间
last_autoanalyzetimestamp with time zone上次这个表被自动清理守护进程分析的时间
vacuum_countbigint这个表已被手工清理的次数(不统计VACUUM FULL
autovacuum_countbigint这个表已被自动清理守护进程清理的次数
analyze_countbigint这个表已被手工分析的次数
autoanalyze_countbigint这个表已被自动清理守护进程分析的次数

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

表 28-13. pg_stat_all_indexes视图

类型描述
relidoid这个索引的基表的 OID
indexrelidoid这个索引的 OID
schemanamename这个索引所在的模式的名称
relnamename这个索引的基表的名称
indexrelnamename这个索引的名称
idx_scanbigint在这个索引上发起的索引扫描次数
idx_tup_readbigint在这个索引上由扫描返回的索引项数量
idx_tup_fetchbigint被使用这个索引的简单索引扫描取得的活着的表行数量

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

索引可以被简单索引扫描、"位图"索引扫描以及优化器使用。在一次位图扫描中,多个索引的输出可以被通过 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统计从表取得的或者的行。如果使用该索引取得了任何死亡行或还未提交的行,或者如果通过一次只用索引扫描的方式避免了任何堆获取,后者将较小。

表 28-14. pg_statio_all_tables视图

类型描述
relidoid一个表的 OID
schemanamename这个表所在的模式的名称
relnamename这个表的名称
heap_blks_readbigint从这个表读取的磁盘块数量
heap_blks_hitbigint在这个表中的缓冲区命中数量
idx_blks_readbigint从这个表上所有索引中读取的磁盘块数
idx_blks_hitbigint在这个表上的所有索引中的缓冲区命中数量
toast_blks_readbigint从这个表的 TOAST 表(如果有)读取的磁盘块数
toast_blks_hitbigint在这个表的 TOAST 表(如果有)中的缓冲区命中数量
tidx_blks_readbigint从这个表的 TOAST 表索引(如果有)中读取的磁盘块数
tidx_blks_hitbigint在这个表的 TOAST 表索引(如果有)中的缓冲区命中数量

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

表 28-15. pg_statio_all_indexes视图

类型描述
relidoid这个索引的基表的 OID
indexrelidoid这个索引的 OID
schemanamename这个索引所在的模式的名称
relnamename这个索引的基表的名称
indexrelnamename这个索引的名称
idx_blks_readbigint从这个索引读取的磁盘块数
idx_blks_hitbigint在这个索引中的缓冲区命中数量

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

表 28-16. pg_statio_all_sequences视图

类型描述
relidoid一个序列的 OID
schemanamename这个序列所在的模式的名称
relnamename这个序列的名称
blks_readbigint从这个序列中读取的磁盘块数
blks_hitbigint在这个序列中的缓冲区命中数量

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

表 28-17. pg_stat_user_functions视图

类型描述
funcidoid一个函数的 OID
schemanamename这个函数所在的模式的名称
funcnamename这个函数的名称
callsbigint这个函数已经被调用的次数
total_timedouble precision在这个函数以及它所调用的其他函数中花费的总时间,以毫秒计
self_timedouble precision在这个函数本身花费的总时间,不包括被它调用的其他函数,以毫秒计

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

28.2.3. 统计函数

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

与统计收集相关的额外函数被列举在表 28-18中。

表 28-18. 额外统计函数

函数返回类型描述
pg_backend_pid()integer 处理当前会话的服务器进程的进程 ID
pg_stat_get_activity(integer)setof record 返回具有指定 PID 的后端相关的一个记录,或者在指定NULL的情况下为系统中每一个活动后端返回一个记录。被返回的域是pg_stat_activity视图中的那些域的一个子集。
pg_stat_get_snapshot_timestamp()带时区的时间戳 返回当前统计信息快照的时间戳
pg_stat_clear_snapshot()void 抛弃当前的统计快照
pg_stat_reset()void 把用于当前数据库的所有统计计数器重置为零(默认要求超级用户权限,但这个函数的 EXECUTE 可以被授予给其他人)。
pg_stat_reset_shared(text)void 把某些集簇范围的统计计数器重置为零,具体哪些取决于参数(默认要求超级用户权限,但这个函数的 EXECUTE 可以被授予给其他人)。 调用pg_stat_reset_shared('bgwriter')pg_stat_bgwriter 视图中显示的所有计数器清零。调用pg_stat_reset_shared('archiver') 将会把pg_stat_archiver视图中展示的所有计数器清零。
pg_stat_reset_single_table_counters(oid)void 把当前数据库中用于单个表或索引的统计数据重置为零(默认要求超级用户权限,但这个函数的 EXECUTE 可以被授予给其他人)
pg_stat_reset_single_function_counters(oid)void 把当前数据库中用于单个函数的统计信息重置为零(默认要求超级用户权限,但这个函数的 EXECUTE 可以被授予给其他人)

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

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

表 28-19. 针对每个后端的统计函数

函数返回类型描述
pg_stat_get_backend_idset()setof integer当前活动后端 ID 号的集合(从 1 到活动后端数目)
pg_stat_get_backend_activity(integer)text这个后端最近查询的文本
pg_stat_get_backend_activity_start(integer)timestamp with time zone最近查询被开始的时间
pg_stat_get_backend_client_addr(integer)inet该客户端连接到这个后端的 IP 地址
pg_stat_get_backend_client_port(integer)integer该客户端用来通信的 TCP 端口号
pg_stat_get_backend_dbid(integer)oid这个后端连接到的数据库的 OID
pg_stat_get_backend_pid(integer)integer这个后端的进程 ID
pg_stat_get_backend_start(integer)timestamp with time zone这个进程被开始的时间
pg_stat_get_backend_userid(integer)oid登录到这个后端的用户的 OID
pg_stat_get_backend_wait_event_type(integer)text如果后端正在等待,则是等待事件类型的名称,否则为 NULL。详见表 28-4
pg_stat_get_backend_wait_event(integer)text如果后端正在等待,则是等待事件的名称,否则为 NULL。详见表 28-4
pg_stat_get_backend_xact_start(integer)timestamp with time zone当前事务被开始的时间