语句统计视图——pg_stat_statements
-
属于 PostgreSQL 的扩展,配置方法如下:
-
首先修改
postgresql.conf#---------------------- # PG_STAT_STATEMENTS OPTIONS #---------------------- shared_preload_libraries = 'pg_stat_statements' custom_variable_classes = 'pg_stat_statements' pg_stat_statements.max = 1000 pg_stat_statements.track = allmax表示 最多记录1000条最耗时的语句track表示 追踪所有语句
-
需要重启数据库集群 -
然后
手动创建CREATE EXTENSION pg_stat_statements;
-
-
pg_stat_statements 视图
SELECT * FROM pg_stat_statements LIMIT 100;- 整体信息
userid执行该语句的 用户 oiddbid执行该语句的 数据库 oidqueryid内部哈希吗,由语句的解析树计算得来query语句的文本
- 数量
calls被执行的总次数rows该语句影响的总行数
- 时间(单位 ms)
total_time执行这类语句消耗的总时间min_time执行这类语句消耗最少的一次时间max_time执行这类语句消耗最多的一次时间mean_time执行这类语句消耗的平均时间stddev_time执行这类语句消耗的标准偏差时间
- 共享块数
shared_blks_hit该语句从 共享缓存 命中的块数shared_blks_read该语句从 共享块 读取的块数shared_blks_dirtied该语句 弄脏的共享块总数shared_blks_written该语句 写入的共享块总数
- 本地块数
local_blks_hit该语句 本地缓存 命中的块数local_blks_read该语句从 本地块 读取的块数local_blks_dirtied该语句 弄脏的本地块总数local_blks_written该语句 写入的本地块总数
- 临时块数
temp_blks_read该语句从 临时块 读取的块数temp_blks_written该语句 写入的临时块总数
- 时间(单位 ms)
- 下面两个,需要
track_io_timing被启用 才能生效,否则为 0 blk_read_time该语句 读取块 消耗的总时间blk_write_time该语句 写入块 消耗的总时间
- 下面两个,需要
- 整体信息
-
找出调用次数多+平均耗时较长的语句
- 粗略查询
SELECT query, calls, total_time, (total_time/calls) as average ,rows, 100.0 * shared_blks_hit /nullif(shared_blks_hit + shared_blks_read, 0) AS hit_percent FROM pg_stat_statements ORDER BY average DESC LIMIT 100;- 前 100 条
- 包含 语句、调用次数、消耗总时间、平均耗时、涉及行、共享缓存命中率
- 按照
平均耗时排序
- 前 100 条
- 精确查询
SELECT query, calls, total_time, (total_time/calls) as average ,rows, 100.0 * shared_blks_hit /nullif(shared_blks_hit + shared_blks_read, 0) AS hit_percent FROM pg_stat_statements WHERE calls > 100000 AND (total_time/calls) > 5 ORDER BY total_time DESC LIMIT 300;- 前 300 条
- 包含同上
- 增加筛选条件: 日均调用 3 万次(这里记录了 8 天的量),语句平均耗时大于 5ms
- 按照
消耗总时间排序
- 前 300 条
- 粗略查询
-
找出造成大量磁盘 IO 的语句
- 精确查询
SELECT * FROM pg_stat_statements ORDER BY shared_blks_read DESC LIMIT 200;- 前 100 条
- 包含 所有项目
- 按照
共享块读取量排序
- 前 100 条
- 精确查询
-
清零
SELECT pg_stat_statements_reset();