统计收集器
Redrock Postgres 的统计收集器是一个支持收集和报告服务器活动信息的子系统。目前,这个收集器可以对表和索引的访问计数,计数可以按磁盘块和个体行来进行。它还跟踪每个表中的总行数、每个表的分析动作的信息。它也统计调用用户定义函数的次数以及在每次调用中花费的总时间。
Redrock Postgres 也支持报告有关系统正在干什么的动态信息,例如当前正在被其他服务器进程执行的命令以及系统中存在哪些其他连接。这个功能是独立于收集器进程存在的。
因为统计收集给查询执行增加了一些负荷,系统可以被配置为收集或不收集信息。这由配置参数控制,它们通常在postgresql.conf
中设置(关于设置配置参数的细节请见第 19 章)。
参数 track_activities 允许监控当前被任意服务器进程执行的命令。
参数 track_counts 控制是否收集关于表和索引访问的统计信息。
参数 track_functions 启用对用户定义函数使用的跟踪。
参数 track_io_timing 启用对块读写次数的监控。
参数 track_wait_events 控制是否收集关于等待事件的统计信息。
通常这些参数被设置在postgresql.conf
中,这样它们会应用于所有服务器进程,但是可以在单个会话中使用 SET 命令打开或关闭它们(为了阻止普通用户对管理员隐藏他们的活动,只有超级用户被允许使用SET
来改变这些参数)。
统计收集器通过临时文件将收集到的信息传送给其他 PostgreSQL 进程。这些文件被存储在名字由 stats_temp_directory 参数指定的目录中,默认是pg_tmp/stats
。为了得到更好的性能,stats_temp_directory
可以被指向一个基于 RAM 的文件系统来降低物理 I/O 需求。当服务器被干净地关闭时,一份统计数据的永久拷贝被存储在pg_stat
子目录中,这样在服务器重启后统计信息能被保持。当在服务器启动时执行恢复时(例如立即关闭、服务器崩溃以及时间点恢复之后),所有统计计数器会被重置。
表 1 中列出了一些预定义视图 可以用来显示系统的当前状态。 表 2 中列出了另一些视图可以 显示统计收集的结果。你也可以使用底层统计函数(在 统计函数 中讨论)来建立自定义的视图。
在使用统计信息监控收集到的数据时,你必须了解这些信息并非是实时更新的。每个独立的服务器进程只在进入闲置状态之前才向收集器传送新的统计计数;因此正在进行的查询或事务并不影响显示出来的总数。同样,收集器本身也最多每PGSTAT_STAT_INTERVAL
毫秒(缺省为 500ms,除非在编译服务器的时候修改过)发送一 次新的报告。因此显示的信息总是落后于实际活动。但是由track_activities
收集的当前查询信息总是最新的。
另一个重点是当一个服务器进程被要求显示任何这些统计信息时,它首先取得收集器进程最近发出的报告并且接着为所有统计视图和函数使用这个快照,直到它的当前事务的结尾。因此只要你继续当前事务,统计数据将会一直显示静态信息。相似地,当任何关于所有会话的当前查询的信息在一个事务中第一次被请求时,这样的信息将被收集。并且在整个事务期间将显示相同的信息。这是一种特性而非缺陷,因为它允许你在该统计信息上执行多个查询并且关联结果而不用担心那些数字会在你不知情的情况下改变。但是如果你希望用每个查询都看到新结果,要确保在任何事务块之外做那些查询。或者,你可以调用pg_stat_clear_snapshot
(),那将丢弃当前事务的统计快照(如果有)。下一次对统计性信息的使用将导致获取一个新的快照。
一个事务也可以在视图pg_stat_xact_all_tables
、pg_stat_xact_all_undos
, pg_stat_xact_sys_tables
、pg_stat_xact_user_tables
和pg_stat_xact_user_functions
中看到它自己的统计信息(还没有被传送给收集器)。这些数字并不像上面所述的那样行动,相反它们在事务期间持续被更新。
表 1 中显示的动态统计视图中的一些信息是有安全限制的。 普通用户只能看到关于他们自己的会话的所有信息(属于他们是成员的角色的会话)。 在关于其他会话的行中,许多列将为空。 但是,请注意,一个会话的存在和它的一般属性,例如会话用户和数据库,对所有用户都是可见的。超级用户和内置角色pg_read_all_stats
的成员(参见第 21.5 节)可以看到所有会话的所有信息。
表 1. 动态统计视图
视图名称 | 描述 |
---|---|
pg_stat_activity |
每个服务器进程一行,显示与那个进程的当前活动相关的信息,例如状态和当前查询。详见 pg_stat_activity 。 |
pg_stat_wait_event |
每个等待事件一行,显示有关每个发生的等待事件的等待信息的统计信息。有关详细信息,请参阅 pg_stat_wait_event。 |
pg_stat_replication |
每一个 WAL 发送进程一行,显示有关到该发送进程连接的后备服务器的复制的统计信息。 详见 pg_stat_replication。 |
表 2. 已收集统计信息的视图
视图名称 | 描述 |
---|---|
pg_stat_database |
每个数据库一行,显示数据库范围的统计信息。详见 pg_stat_database。 |
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_undos |
当前数据库中每个回滚段一行,显示有关访问指定回滚段的统计信息。详见 pg_stat_all_undos。 |
pg_stat_xact_all_undos |
和pg_stat_all_undos 相似,但计数动作只在当前事务内发生(还没有被包括在pg_stat_all_undos 和相关视图中)。用于生存和死亡行数量的列在此视图中不出现。 |
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_undos |
当前数据库中每个回滚段一行,显示:回滚段 OID、模式名、 回滚段名、该回滚段的磁盘块读取总数、该回滚段的缓冲区命中总数。 当前数据库中的每个回滚段包含一行,该行显示指定回滚段上有关 I/O 的统计信息。详见 pg_statio_all_undos。 |
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_statio_
系列视图主要用于判断缓冲区的效果。当实际磁盘读取数远小于缓冲区命中时,这个缓冲能满足大部分读请求而无需进行内核调用。但是,这些统计信息并没有给出所有的事情:由于 PostgreSQL 处理磁盘 I/O 的方式,不在 PostgreSQL 缓冲区中的数据库仍然驻留在内核的 I/O 缓存中,并且因此可以被再次读取而不需要物理磁盘读取。我们建议希望了解 PostgreSQL I/O 行为更多细节的用户将PostgreSQL 统计收集器和操作系统中允许观察内核处理 I/O 的工具一起使用。
pg_stat_activity
视图将为每一个服务器进程有一行,显示与该进程的当前活动相关的信息。
表 3. pg_stat_activity
视图
列 | 类型 | 描述 |
---|---|---|
datid |
oid |
这个后端连接到的数据库的 OID |
datname |
name |
这个后端连接到的数据库的名称 |
pid |
integer |
这个后端的数据库进程 ID |
spid |
integer |
这个后端的操作系统进程 ID |
tid |
integer |
这个后端的数据库线程 ID |
usesysid |
oid |
登录到这个后端的用户的 OID |
usename |
name |
登录到这个后端的用户的名称 |
application_name |
text |
连接到这个后端的应用的名称 |
client_addr |
inet |
连接到这个后端的客户端的 IP 地址。如果这个域为空,它表示客户端通过服务器机器上的一个 Unix 套接字连接或者这是一个内部进程(如自动分析)。 |
client_hostname |
text |
已连接的客户端的主机名,由client_addr 的反向 DNS 查找报告。这个域将只对 IP 连接非空,并且只有 log_hostname 被启用时才会非空。 |
client_port |
integer |
客户端用以和这个后端通信的 TCP 端口号,如果使用 Unix 套接字则为-1 |
backend_start |
timestamp with time zone |
这个进程被启动的时间。对客户端后端来说就是客户端连接到服务器的时间。 |
xact_start |
timestamp with time zone |
这个进程的当前事务被启动的时间,如果没有活动事务则为空。如果当前查询是它的第一个事务,这一列等于query_start 。 |
query_start |
timestamp with time zone |
当前活动查询被开始的时间,如果state 不是active ,这个域为上一个查询被开始的时间 |
state_change |
timestamp with time zone |
state 上一次被改变的时间 |
wait_event_type |
text |
后端正在等待的事件类型,如果不存在则为 NULL。参见 等待事件类型。 |
wait_event |
text |
如果后端当前正在等待,则是等待事件的名称,否则为 NULL。参见 等待事件 章节。 |
memory_used |
bigint |
这个后端占用的内存大小,单位字节 |
state |
text |
这个后端的当前总体状态。可能的值是:active :后端正在执行一个查询。idle :后端正在等待一个新的客户端命令。idle in transaction :后端在一个事务中,但是当前没有正在执行一个查询。idle in transaction (aborted) :这个状态与idle in transaction 相似,不过在该事务中的一个语句导致了一个错误。fastpath function call :后端正在执行一个 fast-path 函数。disabled :如果在这个后端中track_activities被禁用,则报告这个状态。 |
backend_xid |
xid |
这个后端的顶层事务标识符(如果存在)。 |
backend_mintime |
logicaltime |
当前后端的mintime 范围。 |
query |
text |
这个后端最近查询的文本。如果state 为active ,这个域显示当前正在执行的查询。在所有其他状态下,它显示上一个被执行的查询。默认情况下,查询文本会被截断至1024个字符,这个值可以通过参数track_activity_query_size更改。 |
backend_type |
text |
当前后端的类型。可能的类型是 analyze launcher , analyze worker , logical replication launcher , logical replication worker , parallel worker , background writer , client backend , checkpointer , startup , walreceiver , walsender 以及 walwriter 。 除此以外,由扩展注册的后台工作进程可能有额外的类型。 |
wait_event
和state
列是独立的。如果一个后端处于active
状态,它可能是也可能不是某个事件上的waiting
。如果状态是active
并且wait_event
为非空,它意味着一个查询正在被执行,但是它被阻塞在系统中某处。
pg_stat_wait_event
视图将包含当前数据库中的每个等待事件的一行,显示有关每个已发生等待事件的等待信息的统计信息。
表 4. pg_stat_wait_event
视图
列 | 类型 | 描述 |
---|---|---|
wait_event_type |
text |
该等待事件的类型。有关详细信息,请参见 等待事件类型。 |
wait_event |
text |
该等待事件的名称。有关详细信息,请参见 等待事件 章节。 |
waits |
bigint |
此事件发生的次数 |
total_time |
double precision |
在事件中花费的总时间(以毫秒为单位) |
min_time |
double precision |
在事件中花费的最短时间(以毫秒为单位) |
max_time |
double precision |
在事件中花费的最长时间(以毫秒为单位) |
mean_time |
double precision |
在事件中花费的平均时间(以毫秒为单位) |
pg_stat_replication
视图中将为每一个 WAL 发送进程包含一行,用来显示与该发送进程连接的后备服务器的复制统计信息。这个视图中只会列出直接连接的后备机,下游后备服务器的信息不包含在此。
表 5. pg_stat_replication
视图
列 | 类型 | 描述 |
---|---|---|
pid |
integer |
一个 WAL 发送进程的进程 ID |
usesysid |
oid |
登录到这个 WAL 发送进程的用户的 OID |
usename |
name |
登录到这个 WAL 发送进程的用户的名称 |
application_name |
text |
连接到这个 WAL 发送进程的应用的名称 |
client_addr |
inet |
连接到这个 WAL 发送进程的客户端的 IP 地址。 如果这个域为空,它表示该客户端通过服务器机器上的一个 Unix 套接字连接。 |
client_hostname |
text |
连接上的客户端的主机名,由一次对client_addr 的逆向 DNS 查找报告。这个域将只对 IP 连接非空,并且只有在 log_hostname 被启用时非空 |
client_port |
integer |
客户端用来与这个 WAL 发送进程通讯的 TCP 端口号, 如果使用 Unix 套接字则为-1 |
backend_start |
timestamp with time zone |
这个进程开始的时间,即客户端是何时连接到这个 WAL 发送进程的 |
backend_mintime |
logicaltime |
由 hot_standby_feedback 报告 的这个后备机的mintime 水平线。 |
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 位置所花的时间而不是一些用户可能预期的零。这种做法与为近期的写事务测量同步提交和事务可见性延迟的目的一致。为了降低用户预期一种不同的滞后模型带来的混淆,在一个完全重放完的闲置系统上,lag 列会在一段比较短的时间后回复成 NULL。监控系统应该选择将这种情况表示为缺失数据、零或者继续显示最近的已知值。
pg_stat_database
视图将为实例中的每一个数据库包含有一行,再加上一个共享对象,显示出全数据库的统计信息。
表 6. pg_stat_database
视图
列 | 类型 | 描述 |
---|---|---|
datid |
oid |
一个数据库的 OID,或属于共享关系的对象为 0。 |
datname |
name |
此数据库的名称,或共享对象的NULL 。 |
numbackends |
integer |
当前连接到这个数据库的后端数量,或者NULL 为共享对象。 这是此视图中唯一返回反映当前状态的值的列;所有其他列都返回上次重置后的累积值。 |
xact_commit |
bigint |
在这个数据库中已经被提交的事务的数量 |
xact_rollback |
bigint |
在这个数据库中已经被回滚的事务的数量 |
blks_read |
bigint |
在这个数据库中被读取的磁盘块的数量 |
blks_cloned |
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 |
在这个数据库中后端花费在读取数据文件块的时间,以毫秒计 |
blk_clone_time |
double precision |
在这个数据库中后端花费在构造用于一致性读的缓冲页的时间,以毫秒计 |
blk_write_time |
double precision |
在这个数据库中后端花费在写数据文件块的时间,以毫秒计 |
stats_reset |
timestamp with time zone |
这些统计信息上次被重置的时间 |
pg_stat_all_tables
视图将为当前数据库中的每一个表(包括 TOAST 表)包含一行,该行显示与对该表的访问相关的统计信息。pg_stat_user_tables
和pg_stat_sys_tables
视图包含相同的信息,但是被过滤得分别只显示用户和系统表。
表 7. pg_stat_all_tables
视图
列 | 类型 | 描述 |
---|---|---|
relid |
oid |
一个表的 OID |
schemaname |
name |
这个表所在的模式的名称 |
relname |
name |
这个表的名称 |
seq_scan |
bigint |
在这个表上发起的顺序扫描的次数 |
seq_tup_read |
bigint |
被顺序扫描取得的活着的行的数量 |
idx_scan |
bigint |
在这个表上发起的索引扫描的次数 |
idx_tup_fetch |
bigint |
被索引扫描取得的活着的行的数量 |
n_tup_ins |
bigint |
被插入的行数 |
n_tup_upd |
bigint |
被更新的行数(包括 HOT 更新的行) |
n_tup_del |
bigint |
被删除的行数 |
n_tup_hot_upd |
bigint |
被更新的 HOT 行数(即不要求独立索引更新的行更新) |
n_live_tup |
bigint |
活着的行的估计数量 |
n_dead_tup |
bigint |
死亡行的估计数量 |
n_mod_since_analyze |
bigint |
从这个表最后一次被分析后备修改的行的估计数量 |
last_analyze |
timestamp with time zone |
上次这个表被手动分析的时间 |
last_autoanalyze |
timestamp with time zone |
上次这个表被自动分析守护进程分析的时间 |
analyze_count |
bigint |
这个表已被手工分析的次数 |
autoanalyze_count |
bigint |
这个表已被自动分析守护进程分析的次数 |
pg_stat_all_undos
视图将为当前数据库中的每一个回滚段包含一行,该行显示与对该回滚段的访问相关的统计信息。
表 8. pg_stat_all_undos
视图
列 | 类型 | 描述 |
---|---|---|
relid |
oid |
一个回滚段的 OID |
schemaname |
name |
这个回滚段所在的模式的名称 |
relname |
name |
这个回滚段的名称 |
n_tup_fetch |
bigint |
被获取的活着的记录的数量 |
n_tup_ins |
bigint |
被插入的记录数 |
n_tup_upd |
bigint |
被更新的记录数 |
n_tup_del |
bigint |
被删除的记录数 |
n_tup_hot_upd |
bigint |
被更新的 HOT 记录数 |
n_live_tup |
bigint |
活着的记录的估计数量 |
n_dead_tup |
bigint |
死亡记录的估计数量 |
pg_stat_all_indexes
视图将为当前数据库中的每个索引包含一行,该行显示关于对该索引访问的统计信息。pg_stat_user_indexes
和pg_stat_sys_indexes
视图包含相同的信息,但是被过滤得只分别显示用户和系统索引。
表 9. pg_stat_all_indexes
视图
列 | 类型 | 描述 |
---|---|---|
relid |
oid |
这个索引的基表的 OID |
indexrelid |
oid |
这个索引的 OID |
schemaname |
name |
这个索引所在的模式的名称 |
relname |
name |
这个索引的基表的名称 |
indexrelname |
name |
这个索引的名称 |
idx_scan |
bigint |
在这个索引上发起的索引扫描次数 |
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_read
和idx_tup_fetch
计数也可能不同,因为idx_tup_read
统计从该索引取得的索引项而idx_tup_fetch
统计从表取得的活着的行。如果使用该索引取得了任何死亡行或还未提交的行,或者如果通过一次只用索引扫描的方式避免了任何堆获取,后者将较小。
pg_statio_all_tables
视图将为当前数据库中的每个表(包括 TOAST 表)包含一行,该行显示指定表上有关 I/O 的统计信息。pg_statio_user_tables
和pg_statio_sys_tables
视图包含相同的信息,但是被过滤得分别只显示用户表和系统表。
表 10. pg_statio_all_tables
视图
列 | 类型 | 描述 |
---|---|---|
relid |
oid |
一个表的 OID |
schemaname |
name |
这个表所在的模式的名称 |
relname |
name |
这个表的名称 |
heap_blks_read |
bigint |
从这个表读取的磁盘块数量 |
heap_blks_cloned |
bigint |
从这个表构造用于一致性读的缓冲页数量 |
heap_blks_hit |
bigint |
在这个表中的缓冲区命中数量 |
idx_blks_read |
bigint |
从这个表上所有索引中读取的磁盘块数 |
idx_blks_cloned |
bigint |
从这个表上所有索引中构造用于一致性读的缓冲页数 |
idx_blks_hit |
bigint |
在这个表上的所有索引中的缓冲区命中数量 |
toast_blks_read |
bigint |
从这个表的 TOAST 表(如果有)读取的磁盘块数 |
toast_blks_cloned |
bigint |
从这个表的 TOAST 表(如果有)构造用于一致性读的缓冲页数 |
toast_blks_hit |
bigint |
在这个表的 TOAST 表(如果有)中的缓冲区命中数量 |
tidx_blks_read |
bigint |
从这个表的 TOAST 表索引(如果有)中读取的磁盘块数 |
tidx_blks_cloned |
bigint |
从这个表的 TOAST 表索引(如果有)中构造用于一致性读的缓冲页数 |
tidx_blks_hit |
bigint |
在这个表的 TOAST 表索引(如果有)中的缓冲区命中数量 |
pg_statio_all_undos
视图将为当前数据库中的每个回滚段包含一行,该行显示指定回滚段上有关 I/O 的统计信息。
表 11. pg_statio_all_undos
视图
列 | 类型 | 描述 |
---|---|---|
relid |
oid |
一个回滚段的 OID |
schemaname |
name |
这个回滚段所在的模式的名称 |
relname |
name |
这个回滚段的名称 |
undo_blks_read |
bigint |
从这个回滚段读取的磁盘块数量 |
undo_blks_cloned |
bigint |
从这个回滚段构造用于一致性读的缓冲页数量,主要涉及回滚段中的事务表访问 |
undo_blks_hit |
bigint |
在这个回滚段中的缓冲区命中数量 |
pg_statio_all_indexes
视图将为当前数据库中的每个索引包含一行,该行显示指定索引上有关 I/O 的统计信息。pg_statio_user_indexes
和pg_statio_sys_indexes
视图包含相同的信息,但是被过滤得分别只显示用户索引和系统索引。
表 12. pg_statio_all_indexes
视图
列 | 类型 | 描述 |
---|---|---|
relid |
oid |
这个索引的基表的 OID |
indexrelid |
oid |
这个索引的 OID |
schemaname |
name |
这个索引所在的模式的名称 |
relname |
name |
这个索引的基表的名称 |
indexrelname |
name |
这个索引的名称 |
idx_blks_read |
bigint |
从这个索引读取的磁盘块数 |
idx_blks_cloned |
bigint |
从这个索引构造用于一致性读的缓冲页数 |
idx_blks_hit |
bigint |
在这个索引中的缓冲区命中数量 |
pg_statio_all_sequences
视图将为当前数据库中的每个序列包含一行,该行显示在指定序列上有关 I/O 的统计信息。
表 13. pg_statio_all_sequences
视图
列 | 类型 | 描述 |
---|---|---|
relid |
oid |
一个序列的 OID |
schemaname |
name |
这个序列所在的模式的名称 |
relname |
name |
这个序列的名称 |
blks_read |
bigint |
从这个序列中读取的磁盘块数 |
blks_cloned |
bigint |
从这个序列中构造用于一致性读的缓冲页数 |
blks_hit |
bigint |
在这个序列中的缓冲区命中数量 |
其他查看统计信息的方法是直接使用查询,这些查询使用上述标准视图用到的底层统计信息访问函数。如要了解如函数名等细节,可参考标准视图的定义(例如,在psql中你可以发出\d+ pg_stat_activity
)。针对每一个数据库统计信息的访问函数把一个数据库 OID 作为参数来标识要报告哪个数据库。而针对每个表和每个索引的函数要求表或索引 OID。针对每个函数统计信息的函数用一个函数 OID。注意只有在当前数据库中的表、索引和函数才能被这些函数看到。
与统计收集相关的额外函数被列举在表 14 中。
表 14. 额外统计函数
函数 | 描述 |
---|---|
pg_backend_pid () → integer | 处理当前会话的服务器端的数据库进程 ID |
pg_backend_spid () → integer | 处理当前会话的服务器端的操作系统进程 ID |
pg_backend_tid () → integer | 处理当前会话的服务器端的数据库线程 ID |
pg_stat_get_activity ( integer ) → setof record | 返回具有指定 PID 的后端相关的一个记录,或者在指定NULL 的情况下为系统中每一个活动后端返回一个记录。被返回的域是pg_stat_activity 视图中的那些域的一个子集。 |
pg_stat_get_wait_event ( integer ) → setof record | 返回具有指定 PID 的后端相关的一个结果集,或者在指定NULL 的情况下为系统中所有活动后端返回一个汇总的结果集。被返回的域是pg_stat_wait_event 视图中的那些域的一个子集。 |
pg_stat_get_snapshot_timestamp () → timestamp with time zone | 返回当前统计信息快照的时间戳 |
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_wait_event ( integer ) → void | 把具有指定 PID 的后端相关的的等待事件统计计数器重置为零,或者在指定NULL 的情况下将系统中所有活动后端相关的的等待事件统计计数器重置为零(默认要求超级用户权限,但这个函数的 EXECUTE 可以被授予给其他人)。 |
pg_stat_reset_single_table_counters ( oid ) → void | 把当前数据库中用于单个表或索引的统计数据重置为零(默认要求超级用户权限,但这个函数的 EXECUTE 可以被授予给其他人) |
pg_stat_reset_single_function_counters ( oid ) → void | 把当前数据库中用于单个函数的统计信息重置为零(默认要求超级用户权限,但这个函数的 EXECUTE 可以被授予给其他人) |
pg_stat_get_activity
是pg_stat_activity
视图的底层函数,它返回一个行集合,其中包含有关每个后端进程所有可用的信息。有时只获得该信息的一个子集可能会更方便。在那些情况中,可以使用一组更老的针对每个后端的统计访问函数,这些显示在表 15 中。这些访问函数使用一个后端 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;
表 15. 针对每个后端的统计函数
函数 | 描述 |
---|---|
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_spid ( integer ) → integer | 这个后端的操作系统进程 ID |
pg_stat_get_backend_tid ( 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。参见 等待事件类型。 |
pg_stat_get_backend_wait_event ( integer ) → text | 如果后端正在等待,则是等待事件的名称,否则为 NULL。参见 等待事件 章节。 |
pg_stat_get_backend_memory_used ( integer ) → bigint | 这个后端占用的内存大小,单位字节 |
pg_stat_get_backend_xact_start ( integer ) → timestamp with time zone | 当前事务被开始的时间 |