PostgreSQL 9.5.3 中文手册 | |||
---|---|---|---|
上一页 | 上一级 | 章 27. 监控数据库活动 | 下一页 |
PostgreSQL的统计收集器 是一个支持收集和报告服务器活动信息的子系统。目前,这个收集器可以对表和索引的访问计数, 计数可以按磁盘块和个体行来进行。它还跟踪每个表中的总行数、每个表的清理和分析动作的信息。 它也统计调用用户定义函数的次数以及在每次调用中花费的总时间。
PostgreSQL还支持报告关于系统中正在发生什么的动态信息, 比如当前其它服务器进程正在执行的命令,系统中存在的其他链接。这是独立于收集器进程的功能。
因为统计收集给查询执行增加了一些负荷,系统可以被配置为收集或不收集信息。 这是由配置参数控制的,它们通常在postgresql.conf中设置 (关于设置配置参数的细节请见第 18 章)。
参数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-1中列出了一些预定义视图, 可以用来显示系统的当前状态,在表 27-2 中还列出了几个其他视图可以用来显示统计收集的结果。你也可以使用底层统计函数 (在第 27.2.3 节中讨论)来建立自定义的视图。
在使用统计信息监控收集的数据时,你必须了解这些信息并非是实时更新的。 每个独立的服务器进程只在进入闲置状态之前才向收集器传送新的统计计数; 因此正在进行的查询或事务并不影响显示出来的总数。同样,收集器本身也最多每 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_stat_activity | 每个服务器进程一行,显示与那个进程的当前活动相关的信息,例如状态和当前查询。 详见pg_stat_activity。 |
pg_stat_replication | 每个 WAL 发送者进程一行,显示与到该发送者连接到的后备服务器的复制相关的统计信息。 详见pg_stat_replication。 |
pg_stat_ssl | 每个连接(普通或复制)一行,显示关于该连接中使用的SSL的信息。 详细信息请参阅pg_stat_ssl。 |
表 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_statio_系列视图主要用于判断缓冲区的效果。 当实际磁盘读取数远小于缓冲区命中时,这个缓冲能满足大部分读请求而无需进行内核调用。 但是,这些统计信息并没有给出所有的事情:由于PostgreSQL 处理磁盘 I/O 的方式,不在PostgreSQL 缓冲区缓存中的数据可能仍然驻留在内核的 I/O 缓存中, 并且因此可以被再次读取而不需要物理磁盘读取。我们建议希望了解 PostgreSQL I/O 行为更多细节的用户将PostgreSQL 统计收集器和操作系统中允许观察内核处理 I/O 的工具一起使用。
表 27-3. pg_stat_activity 视图
列 | 类型 | 描述 |
---|---|---|
datid | oid | 这个后端连接到的数据库的OID |
datname | name | 这个后端连接到的数据库的名称 |
pid | 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上一次被改变的时间 |
waiting | boolean | 如果这个后端正在等待一个锁则为真 |
state | text | 这个后端的当前总体状态。可能的值是:
|
backend_xid | xid | 这个后端的顶层事务标识符(如果存在)。 |
backend_xmin | xid | 当前后端的xmin范围。 |
query | text | 这个后端最近查询的文本。如果state为active, 这个域显示当前正在执行的查询。在所有其他状态下,它显示上一个被执行的查询。 |
pg_stat_activity视图将为每一个服务器进程有一行, 显示与该进程的当前活动相关的信息。
注意: waiting和state列是独立的。如果一个后端处于 active状态,它可能是也可能不是waiting。 如果状态是active并且waiting为真, 它意味着正在执行一个查询,但是被系统中某处的一个锁阻塞。
表 27-4. 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_xmin | xid | hot_standby报告的这个后备机的xmin范围。 |
state | text | 当前 WAL 发送者的状态 |
sent_location | pg_lsn | 在这个连接上被发送的最后的事务日志位置 |
write_location | pg_lsn | 被这个后备服务器写入到磁盘的最后的事务日志位置 |
flush_location | pg_lsn | 被这个后备服务器刷入到磁盘的最后的事务日志位置 |
replay_location | pg_lsn | 后备服务器上重放到数据库中的最后的事务日志位置 |
sync_priority | integer | 这个后备服务器被选中为同步后备的优先级 |
sync_state | text | 这个后备服务器的同步状态 |
pg_stat_replication视图将为每个 WAL 发送者进程包含一行, 显示复制到发送者连接到的后备服务器的统计信息。只列出直接连接的后备服务器, 没有关于下游后备服务器的信息。
表 27-5. 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 |
compression | boolean | 如果正在使用SSL压缩,则为true,否则为false, 如果SSL未在此连接上使用,则为NULL |
clientdn | text | 来自所使用的客户端证书的可分辨名称(DN)字段, 如果未提供客户端证书或者SSL未在此连接上使用,则为NULL。 如果DN字段长于NAMEDATALEN(标准构建中为64个字符), 则此字段将被截断 |
pg_stat_ssl视图将为每个后端或WAL发送者进程包含一行, 显示有关此连接上的SSL使用情况的统计信息。它可以连接到pid 列上的pg_stat_activity或pg_stat_replication, 以获取有关连接的更多详细信息。
表 27-6. 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 | 这些统计信息最后一次被重置的时间 |
pg_stat_archiver视图将总是只有一行, 该行包含着有关集簇的归档进程的数据。
表 27-7. pg_stat_bgwriter视图
列 | 类型 | 描述 |
---|---|---|
checkpoints_timed | bigint | 已经被执行的计划中检查点的数量 |
checkpoints_req | bigint | 已经被执行的请求检查点的数量 |
checkpoint_write_time | double precision | 文件被写入磁盘的检查点处理部分花费的总时间,以毫秒计 |
checkpoint_sync_time | double precision | 文件被同步到磁盘中的检查点处理部分花费的总时间,以毫秒计 |
buffers_checkpoint | bigint | 在检查点期间被写的缓冲区数目 |
buffers_clean | bigint | 被后台写进程写的缓冲区数目 |
maxwritten_clean | bigint | 后台写进程由于已经写了太多缓冲区而停止清洁扫描的次数 |
buffers_backend | bigint | 被一个后端直接写的缓冲区数量 |
buffers_backend_fsync | bigint | 一个后端不得不自己执行fsync 调用的次数
(通常即使后端自己进行写操作,后台写进程也会处理这些) |
buffers_alloc | bigint | 被分配的缓冲区数量 |
stats_reset | timestamp with time zone | 这些统计信息上次被重置的时间 |
pg_stat_bgwriter视图将总是只有一行,它包含集簇的全局数据。
表 27-8. pg_stat_database视图
列 | 类型 | 描述 |
---|---|---|
datid | oid | 一个数据库的 OID |
datname | name | 这个数据库的名称 |
numbackends | integer | 当前连接到这个数据库的后端数量。这是在这个视图中唯一一个返回反映当前状态值的列。 所有其他列返回从上次重置以来积累的值。 |
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 | 在这个数据库中检测到的死锁数 |
blk_read_time | double precision | 在这个数据库中通过后端读取数据文件块花费的时间,以毫秒计算 |
blk_write_time | double precision | 在这个数据库中通过后端写入数据文件块花费的时间,以毫秒计算 |
stats_reset | timestamp with time zone | 这些统计信息上次被重置的时间 |
pg_stat_database视图将为集簇中的每一个数据库包含有一行, 显示数据库范围的统计信息。
表 27-9. pg_stat_database_conflicts视图
列 | 类型 | 描述 |
---|---|---|
datid | oid | 数据库的 OID |
datname | name | 这个数据库的名称 |
confl_tablespace | bigint | 在这个数据库中由于已删除表空间而被取消的查询数量 |
confl_lock | bigint | 在这个数据库中由于锁超时而被取消的查询数量 |
confl_snapshot | bigint | 在这个数据库中由于老旧快照而被取消的查询数量 |
confl_bufferpin | bigint | 在这个数据库中由于被占用的缓冲区而被取消的查询数量 |
confl_deadlock | bigint | 在这个数据库中由于死锁而被取消的查询数量 |
pg_stat_database_conflicts视图将为每一个数据库包含一行, 该行显示数据库范围发生的由于与后备服务器上的恢复冲突而取消的查询相关的统计信息。 这个视图将只包含在后备服务器上的信息,因为在主服务器上不会发生冲突。
表 27-10. 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 | 更新的行数(包括热更新的行) |
n_tup_del | bigint | 删除的行数 |
n_tup_hot_upd | bigint | HOT 更新的行数(即不要求独立索引更新的行更新) |
n_live_tup | bigint | 活着的行的估计数量 |
n_dead_tup | bigint | 死亡行的估计数量 |
n_mod_since_analyze | bigint | 自从这个表最后被分析后,修改的行数的估计 |
last_vacuum | timestamp with time zone | 上次这个表被手动清理的时间(不统计VACUUM FULL) |
last_autovacuum | timestamp with time zone | 上次这个表被自动清理守护进程清理的时间 |
last_analyze | timestamp with time zone | 上次这个表被手动分析的时间 |
last_autoanalyze | timestamp with time zone | 上次这个表被自动清理守护进程分析的时间 |
vacuum_count | bigint | 这个表被手动清理的次数(不统计VACUUM FULL) |
autovacuum_count | bigint | 这个表被自动清理守护进程清理的次数 |
analyze_count | bigint | 这个表被手动分析的次数 |
autoanalyze_count | bigint | 这个表被自动清理守护进程分析的次数 |
pg_stat_all_tables视图将为当前数据库中的每一个表 (包括 TOAST 表)包含一行,该行显示与对该表的访问相关的统计信息。 pg_stat_user_tables和pg_stat_sys_tables 视图包含相同的信息,但是被过滤得分别只显示用户和系统表。
表 27-11. 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 | 被使用这个索引的简单索引扫描取得的活着的表行数量 |
pg_stat_all_indexes视图将为当前数据库中的每个索引包含一行, 该行显示关于对该索引访问的统计信息。pg_stat_user_indexes和 pg_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_read和idx_tup_fetch 计数也可能不同,因为idx_tup_read统计从该索引取得的索引项而 idx_tup_fetch统计从表取得的活的行。 如果使用该索引取得了任何死亡行或还未提交的行, 或者如果通过一次只用索引扫描的方式避免了任何堆获取,后者将较小。
表 27-12. 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 表索引(如果有)中的缓冲区命中数量 |
pg_statio_all_tables视图将为当前数据库中的每个表 (包括 TOAST 表)包含一行,该行显示指定表上有关 I/O 的统计信息。 pg_statio_user_tables和 pg_statio_sys_tables视图包含相同的信息, 但是被过滤得分别只显示用户表和系统表。
表 27-13. pg_statio_all_indexes视图
列 | 类型 | 描述 |
---|---|---|
relid | oid | 这个索引的基表的 OID |
indexrelid | oid | 这个索引的 OID |
schemaname | name | 这个索引所在的模式的名称 |
relname | name | 这个索引的基表的名称 |
indexrelname | name | 这个索引的名称 |
idx_blks_read | bigint | 从这个索引读取的磁盘块数 |
idx_blks_hit | bigint | 在这个索引中的缓冲区命中数量 |
pg_statio_all_indexes视图将为当前数据库中的每个索引包含一行, 该行显示指定索引上有关 I/O 的统计信息。pg_statio_user_indexes 和pg_statio_sys_indexes视图包含相同的信息, 但是被过滤得分别只显示用户索引和系统索引。
表 27-14. pg_statio_all_sequences视图
列 | 类型 | 描述 |
---|---|---|
relid | oid | 一个序列的 OID |
schemaname | name | 这个序列所在的模式的名称 |
relname | name | 这个序列的名称 |
blks_read | bigint | 从这个序列中读取的磁盘块数 |
blks_hit | bigint | 在这个序列中的缓冲区命中数量 |
pg_statio_all_sequences视图将为当前数据库中的每个序列包含一行, 该行显示在指定序列上有关 I/O 的统计信息。
表 27-15. pg_stat_user_functions视图
列 | 类型 | 描述 |
---|---|---|
funcid | oid | 一个函数的 OID |
schemaname | name | 这个函数所在的模式的名称 |
funcname | name | 这个函数的名称 |
calls | bigint | 这个函数已经被调用的次数 |
total_time | double precision | 在这个函数以及它所调用的其他函数中花费的总时间,以毫秒计 |
self_time | double precision | 在这个函数本身花费的总时间,不包括它调用的其他函数,以毫秒计 |
pg_stat_user_functions视图将为每一个被追踪的函数包含一行, 该行显示有关该函数执行的统计信息。track_functions 参数控制到底跟踪哪些函数。
其他查看统计信息的方法是直接使用查询,这些查询使用上述标准视图用到的底层统计信息访问函数。 如要了解如函数名等细节,可参考标准视图的定义(例如,在psql中你可以发出 \d+ pg_stat_activity)。针对每一个数据库统计信息的访问函数把一个数据库 OID 作为参数来标识要报告哪个数据库。而针对每个表和每个索引的函数要求表或索引 OID。 针对每个函数统计信息的函数用一个函数 OID。注意只有在当前数据库中的表、 索引和函数才能被这些函数看到。
与统计收集相关的额外函数被列举在表 27-16中。
表 27-16. 额外统计函数
函数 | 返回类型 | 描述 |
---|---|---|
pg_backend_pid() | integer | 处理当前会话的服务器进程的进程 ID |
pg_stat_get_activity (integer) | setof record | 返回具有指定 PID 的后端相关的一个信息记录,或者在指定NULL 的情况下为系统中每一个活动后端返回一个记录。被返回的域是 pg_stat_activity视图中的那些域的一个子集。 |
pg_stat_get_snapshot_timestamp() | timestamp with time zone | 返回当前统计快照的时间戳 |
pg_stat_clear_snapshot() | void | 抛弃当前的统计快照 |
pg_stat_reset() | void | 把用于当前数据库的所有统计计数器重置为零(要求超级用户权限) |
pg_stat_reset_shared (text) | void | 把某些集簇范围的统计计数器重置为零,具体哪些取决于参数(要求超级用户权限)。 调用pg_stat_reset_shared('bgwriter')把pg_stat_bgwriter 视图中显示的所有计数器清零。调用pg_stat_reset_shared('archiver') 将会把pg_stat_archiver视图中展示的所有计数器清零。 |
pg_stat_reset_single_table_counters (oid) | void | 把当前数据库中用于单个表或索引的统计数据重置为零(要求超级用户权限) |
pg_stat_reset_single_function_counters (oid) | void | 把当前数据库中用于单个函数的统计信息重置为零(要求超级用户权限) |
pg_stat_get_activity
是pg_stat_activity视图的底层函数,
它返回一个行集合,其中包含有关每个后端进程所有可用的信息。
有时只获得该信息的一个子集可能会更方便。在那些情况中,
可以使用一组更老的针对每个后端的统计访问函数,这些显示在
表 27-17中。这些访问函数使用一个后端 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-17. 针对每个后端的统计函数
函数 | 返回类型 | 描述 |
---|---|---|
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_waiting(integer) | boolean | 如果这个后端当前正在等待一个锁,则为真 |
pg_stat_get_backend_xact_start(integer) | timestamp with time zone | 当前事务开始的时间 |