pgsql.cc 提供对 postgresql.org 官网内容的中文翻译,由 Pigsty 团队维护。
pg_stat_statements模块提供了一种机制,用于跟踪服务器执行的所有 SQL 语句的执行统计信息。
由于该模块需要额外的共享内存,因此必须通过在postgresql.conf中将pg_stat_statements加入shared_preload_libraries来加载该模块。这意味着添加或移除此模块都需要重启服务器。
pg_stat_statements 视图该模块收集的统计信息可通过名为 pg_stat_statements 的系统视图获取。该视图为每个 不同的查询文本、数据库 ID 和用户 ID 各包含一行(最多达到该模块 能够跟踪的不同语句数量上限)。视图的列见 表 F.22。
表 F.22. pg_stat_statements 列
| Name | Type | References | Description |
|---|---|---|---|
userid |
oid |
|
OID of user who executed the statement |
dbid |
oid |
|
OID of database in which the statement was executed |
query |
text |
Text of the statement (up to track_activity_query_size bytes) | |
calls |
bigint |
Number of times executed | |
total_time |
double precision |
Total time spent in the statement, in seconds | |
rows |
bigint |
Total number of rows retrieved or affected by the statement | |
shared_blks_hit |
bigint |
Total number of shared blocks hits by the statement | |
shared_blks_read |
bigint |
Total number of shared blocks reads by the statement | |
shared_blks_written |
bigint |
Total number of shared blocks writes by the statement | |
local_blks_hit |
bigint |
Total number of local blocks hits by the statement | |
local_blks_read |
bigint |
Total number of local blocks reads by the statement | |
local_blks_written |
bigint |
Total number of local blocks writes by the statement | |
temp_blks_read |
bigint |
Total number of temp blocks reads by the statement | |
temp_blks_written |
bigint |
Total number of temp blocks writes by the statement |
该视图以及函数pg_stat_statements_reset只有在通过安装pg_stat_statements扩展而专门安装了它们的数据库中才可用。不过,只要pg_stat_statements模块被装载到服务器中,无论视图是否存在,它都会跟踪该服务器上所有数据库的统计信息。
出于安全原因,非超级用户不允许查看其他用户执行的查询的文本。 不过,只要该视图已经安装在其数据库中,他们仍然可以查看统计 信息。
注意,只要文本相同,语句就被视为相同的语句,无论语句中使用的 任何离线参数的值如何。使用离线参数有助于把语句分组,从而可能 使统计信息更有用。
pg_stat_statements_reset() returns voidpg_stat_statements_reset会丢弃到目前为止由pg_stat_statements收集的所有统计信息。默认情况下,只有超级用户可以执行此函数。
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.track_utility (boolean)pg_stat_statements.track_utility 控制该模块是否跟踪实用命令。 实用命令是除 SELECT、INSERT、 UPDATE 和 DELETE 之外的所有命令。 默认值为 on。 只有超级用户可以更改此设置。
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
bench=# SELECT pg_stat_statements_reset();
$ pgbench -i bench
$ pgbench -c10 -t300 -M prepared bench
bench=# \x
bench=# SELECT query, calls, total_time, rows, 100.0 * shared_blks_hit /
nullif(shared_blks_hit + shared_blks_read, 0) AS hit_percent
FROM pg_stat_statements ORDER BY total_time DESC LIMIT 5;
-[ RECORD 1 ]---------------------------------------------------------------------
query | UPDATE pgbench_branches SET bbalance = bbalance + $1 WHERE bid = $2;
calls | 3000
total_time | 9.60900100000002
rows | 2836
hit_percent | 99.9778970000200936
-[ RECORD 2 ]---------------------------------------------------------------------
query | UPDATE pgbench_tellers SET tbalance = tbalance + $1 WHERE tid = $2;
calls | 3000
total_time | 8.015156
rows | 2990
hit_percent | 99.9731126579631345
-[ RECORD 3 ]---------------------------------------------------------------------
query | copy pgbench_accounts from stdin
calls | 1
total_time | 0.310624
rows | 100000
hit_percent | 0.30395136778115501520
-[ RECORD 4 ]---------------------------------------------------------------------
query | UPDATE pgbench_accounts SET abalance = abalance + $1 WHERE aid = $2;
calls | 3000
total_time | 0.271741999999997
rows | 3000
hit_percent | 93.7968855088209426
-[ RECORD 5 ]---------------------------------------------------------------------
query | alter table pgbench_accounts add primary key (aid)
calls | 1
total_time | 0.08142
rows | 0
hit_percent | 34.4947735191637631
Takahiro Itagaki <itagaki.takahiro@oss.ntt.co.jp>
译文有误、术语不当或页面显示问题,请到译文仓库 pgsty/pgdoc 报告译文问题。 英文原文本身的问题,请在当前版本的对应页面向上游反馈;上游不再修订已结束维护的版本。