F.27. pg_stat_statements #
pg_stat_statements模块提供了一种机制,用于跟踪服务器执行的所有 SQL 语句的执行统计信息。
由于该模块需要额外的共享内存,因此必须通过在postgresql.conf中将pg_stat_statements加入shared_preload_libraries来加载该模块。这意味着添加或移除此模块都需要重启服务器。
F.27.1. pg_stat_statements 视图
该模块收集的统计信息可通过名为
pg_stat_statements 的系统视图获取。该视图为每个不同的查询文本、数据库 ID 和用户 ID 各包含一行(最多达到该模块能够跟踪的不同语句数量上限)。视图的列见表 F.24。
表 F.24. pg_stat_statements 列
| 名称 | 类型 | 引用 | 描述 |
|---|---|---|---|
userid | oid | | 执行该语句的用户的 OID |
dbid | oid | | 执行该语句的数据库的 OID |
query | text | 语句的文本(最多track_activity_query_size字节) | |
calls | bigint | 执行次数 | |
total_time | double precision | 该语句所花费的总时间,单位为秒 | |
rows | bigint | 该语句检索或影响的总行数 |
该视图以及函数 pg_stat_statements_reset,只有在通过运行 pg_stat_statements.sql 安装脚本而专门安装了它们的数据库中才可用。不过,只要
pg_stat_statements 模块被装载到服务器中,无论视图是否存在,它都会跟踪该服务器上所有数据库的统计信息。
出于安全原因,非超级用户不允许查看其他用户执行的查询的文本。不过,只要该视图已经安装在其数据库中,他们仍然可以查看统计信息。
注意,只要文本相同,语句就被视为相同的语句,无论语句中使用的任何带外参数的值如何。使用带外参数有助于把语句分组,从而可能使统计信息更有用。
F.27.2. 函数
-
pg_stat_statements_reset() returns void pg_stat_statements_reset会丢弃到目前为止由pg_stat_statements收集的所有统计信息。默认情况下,只有超级用户可以执行此函数。
F.27.3. 配置参数
-
pg_stat_statements.max(integer) pg_stat_statements.max是该模块跟踪的语句最大数量(即pg_stat_statements视图中的最大行数)。如果观察到的不同语句超过该数量,则执行次数最少的语句信息会被丢弃。默认值为 1000。该参数只能在服务器启动时设置。-
pg_stat_statements.track(enum) pg_stat_statements.track控制该模块统计哪些语句。指定top可跟踪顶层语句(即直接由客户端发出的语句),指定all还会跟踪嵌套语句(例如在函数内调用的语句),而指定none则会禁用。默认值为top。只有超级用户可以更改此设置。-
pg_stat_statements.save(boolean) pg_stat_statements.save指定是否在服务器关闭后保留语句统计信息。如果它为off,则在关闭时不会保存统计信息,并且在服务器启动时也不会重新载入这些统计信息。默认值为on。该参数只能在postgresql.conf文件中或在服务器命令行上设置。
该模块需要约 pg_stat_statements.max
* track_activity_query_size字节的额外共享内存。注意,只要该模块被装载,就会消耗这些内存,即使
pg_stat_statements.track 被设为 none。
为了能在 postgresql.conf 文件中设置这些参数,你需要把 pg_stat_statements 加入custom_variable_classes。典型用法如下:
# postgresql.conf shared_preload_libraries = 'pg_stat_statements' custom_variable_classes = 'pg_stat_statements' pg_stat_statements.max = 10000 pg_stat_statements.track = all
F.27.4. 示例输出
$ pgbench -i bench postgres=# SELECT pg_stat_statements_reset(); $ pgbench -c10 -t300 -M prepared bench postgres=# \x postgres=# SELECT * FROM pg_stat_statements ORDER BY total_time DESC LIMIT 3; -[ RECORD 1 ]------------------------------------------------------------ userid | 10 dbid | 63781 query | UPDATE branches SET bbalance = bbalance + $1 WHERE bid = $2; calls | 3000 total_time | 20.716706 rows | 3000 -[ RECORD 2 ]------------------------------------------------------------ userid | 10 dbid | 63781 query | UPDATE tellers SET tbalance = tbalance + $1 WHERE tid = $2; calls | 3000 total_time | 17.1107649999999 rows | 3000 -[ RECORD 3 ]------------------------------------------------------------ userid | 10 dbid | 63781 query | UPDATE accounts SET abalance = abalance + $1 WHERE aid = $2; calls | 3000 total_time | 0.645601 rows | 3000
F.27.5. 作者
Takahiro Itagaki <itagaki.takahiro@oss.ntt.co.jp>