TOP SQL, 是指使用资源最多的SQL语句 ,衡量标准是较高的磁盘读取(IO消耗)和较高的逻辑读取( CPU 消耗)。
pg_stat_statements模块
pg_stat_statements模块必须通过在postgresql.conf的shared_preload_libraries中增 加pg_stat_statements来载入,用于收集SQL层面的统计信息, 如SQL被执行了多少次, 总共耗时, IO的耗时, 命中率等。一般用于发现业务上最频繁调用的SQL是什么, 有针对性的进行SQL优化。
如果要监控IO的时间, 可以打开以下参数, 会带来较大的开销, 一般不建议打开。
track_io_timing = on
pg_stat_statements视图
| 名称 | 类型 | 引用 | 描述 |
|---|---|---|---|
| userid | oid | pg_authid.oid | 执行该语句的用户的OID |
| dbid | oid | pg_database.oid | 在其中执行该语句的数据库的OID |
| queryid | bigint | 内部哈希码,从语句的解析树计算得来 | |
| query | text | 语句的文本形式 | |
| calls | bigint | 被执行的次数 | |
| total_time | double | 在该语句中花费的总时间,以毫秒计 | |
| min_time | double | 在该语句中花费的最小时间,以毫秒计 | |
| max_time | double | 在该语句中花费的最大时间,以毫秒计 | |
| mean_time | double | 在该语句中花费的平均时间,以毫秒计 | |
| stddev_time | double | 在该语句中花费时间的总体标准偏差,以毫秒计 | |
| rows | bigint | 该语句检索或影响的行总数 | |
| shared_blks_hit | bigint | 该语句造成的共享块缓冲命中总数 | |
| shared_blks_read | bigint | 该语句读取的共享块的总数 | |
| shared_blks_dirtied | bigint | 该语句弄脏的共享块的总数 | |
| shared_blks_written | bigint | 该语句写入的共享块的总数 | |
| local_blks_hit | bigint | 该语句造成的本地块缓冲命中总数 | |
| local_blks_read | bigint | 该语句读取的本地块的总数 | |
| local_blks_dirtied | bigint | 该语句弄脏的本地块的总数 | |
| local_blks_written | bigint | 该语句写入的本地块的总数 | |
| temp_blks_read | bigint | 该语句读取的临时块的总数 | |
| temp_blks_written | bigint | 该语句写入的临时块的总数 | |
| blk_read_time | double | 该语句花在读取块上的总时间,以毫秒计(如果track_io_timing被启用,否则为零) | |
| blk_write_time | double | 该语句花在写入块上的总时间,以毫秒计(如果track_io_timing被启用,否则为零) |
配置参数
pg_stat_statements.max (integer)
pg_stat_statements.max是由该模块跟踪的语句的最大数目(即pg_stat_statements视图中行的最大数量)。如果观测到的可区分的语句超过这个数量,最少被执行的语句的信息将会被丢弃。默认值为 5000。这个参数只能在服务器启动时设置。
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文件中或者在服务器命令行上设置。
应用示例
配置文件postgresql.conf
增加参数,重启生效
shared_preload_libraries = 'pg_stat_statements'
pg_stat_statements.max = 10000
pg_stat_statements.track = all
进入数据库中,创建模块
test=# create extension pg_stat_statements;
CREATE EXTENSION
用pgbench进行tpc-b基准测试,制造场景
[postgres@sdw3 ~]$ pgbench -i test
dropping old tables...
NOTICE: table "pgbench_accounts" does not exist, skipping
NOTICE: table "pgbench_branches" does not exist, skipping
NOTICE: table "pgbench_history" does not exist, skipping
NOTICE: table "pgbench_tellers" does not exist, skipping
creating tables...
generating data...
100000 of 100000 tuples (100%) done (elapsed 0.16 s, remaining 0.00 s)
vacuuming...
creating primary keys...
done.
[postgres@sdw3 ~]$ pgbench -c10 -T30 test
starting vacuum...end.
transaction type: <builtin: TPC-B (sort of)>
scaling factor: 1
query mode: simple
number of clients: 10
number of threads: 1
duration: 30 s
number of transactions actually processed: 51603
latency average = 5.816 ms
tps = 1719.510708 (including connections establishing)
tps = 1719.639281 (excluding connections establishing)
查询视图pg_stat_statements
,看到TOP SQL
test=# select * from pg_stat_statements;
-[ RECORD 1 ]-------+-----------------------------------------------------------------------------------------------------
userid | 10
dbid | 16548
queryid | -5197238014707241433
query | UPDATE pgbench_branches SET bbalance = bbalance + $1 WHERE bid = $2
calls | 51903
total_time | 127173.038691001
min_time | 0.00989
max_time | 120.92112
mean_time | 2.45020593589965
stddev_time | 2.51943335266969
rows | 51903
shared_blks_hit | 696222
shared_blks_read | 21
shared_blks_dirtied | 21
shared_blks_written | 0
local_blks_hit | 0
local_blks_read | 0
local_blks_dirtied | 0
local_blks_written | 0
temp_blks_read | 0
temp_blks_written | 0
blk_read_time | 0
blk_write_time | 0
-[ RECORD 2 ]-------+-----------------------------------------------------------------------------------------------------
userid | 10
dbid | 16548
queryid | -400055714736107206
query | UPDATE pgbench_accounts SET abalance = abalance + $1 WHERE aid = $2
calls | 51903
total_time | 1483.21244500002
使用pg_stat_statements_reset函数抛弃目前由pg_stat_statements收集的所有统计信息
postgres=# select pg_stat_statements_reset();




