暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

使用pg_stat_statements监控PG数据库的TOP SQL

叶同学专栏 2021-04-16
1474

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视图

名称类型引用描述
useridoidpg_authid.oid执行该语句的用户的OID
dbidoidpg_database.oid在其中执行该语句的数据库的OID
queryidbigint
内部哈希码,从语句的解析树计算得来
querytext
语句的文本形式
callsbigint
被执行的次数
total_timedouble
在该语句中花费的总时间,以毫秒计
min_timedouble
在该语句中花费的最小时间,以毫秒计
max_timedouble
在该语句中花费的最大时间,以毫秒计
mean_timedouble
在该语句中花费的平均时间,以毫秒计
stddev_timedouble
在该语句中花费时间的总体标准偏差,以毫秒计
rowsbigint
该语句检索或影响的行总数
shared_blks_hitbigint
该语句造成的共享块缓冲命中总数
shared_blks_readbigint
该语句读取的共享块的总数
shared_blks_dirtiedbigint
该语句弄脏的共享块的总数
shared_blks_writtenbigint
该语句写入的共享块的总数
local_blks_hitbigint
该语句造成的本地块缓冲命中总数
local_blks_readbigint
该语句读取的本地块的总数
local_blks_dirtiedbigint
该语句弄脏的本地块的总数
local_blks_writtenbigint
该语句写入的本地块的总数
temp_blks_readbigint
该语句读取的临时块的总数
temp_blks_writtenbigint
该语句写入的临时块的总数
blk_read_timedouble
该语句花在读取块上的总时间,以毫秒计(如果track_io_timing被启用,否则为零)
blk_write_timedouble
该语句花在写入块上的总时间,以毫秒计(如果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();


文章转载自叶同学专栏,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论