Statements 统计分析
pg_stat_statements
是 ProtonBase 提供的一个强大的统计扩展,允许用户跟踪和分析 SQL 查询的执行情况。这对于性能优化、慢查询跟踪和理解数据库负载有极大的帮助。
pg_stat_statements
中的查询文本会被“规范化”处理,相同逻辑的 SQL(带不同参数)会合并统计,如 SELECT * FROM table WHERE id = $1
。
场景简介
pg_stat_statements
的典型使用场景包括:
- 定位性能瓶颈:识别执行耗时最长或资源消耗最大的 SQL。
- 优化查询:找到低效的查询(如频繁全表扫描或缺少索引的语句)。
- 监控数据库负载:跟踪数据库的慢查询和请求模式。
- 容量规划:了解最常被访问的表或最大资源消耗的查询模式,以规划未来优化任务。
加载扩展
- 加载扩展,首先在数据库中启用扩展,需要具备系统管理员权限执行,扩展的详细介绍,参考pg_stat_statements:
CREATE EXTENSION pg_stat_statements;
- 启用成功后,会在 public schema 下创建两个 View,分别是'pg_stat_statements' 和 'pg_stat_statements_info',可通过以下命令查看扩展已生效:
SELECT pg_stat_statements_reset(); -- 重置统计数据
SELECT * FROM pg_stat_statements LIMIT 1;
常见用法
基础统计查询
获取被执行 SQL 的统计信息:
SELECT
query,
calls, -- 执行次数
total_exec_time, -- 累计执行时间(毫秒)
mean_exec_time, -- 平均执行时间
rows -- 返回的行数
FROM pg_stat_statements
ORDER BY total_exec_time DESC
LIMIT 10; -- 查找执行时间最长的 10 条 SQL
分析效率低的查询
查找返回行数较少但执行时间较长的查询:
SELECT
query,
calls,
rows,
mean_exec_time
FROM pg_stat_statements
WHERE calls > 50 -- 执行次数大于50,过滤掉采样噪声
ORDER BY mean_exec_time DESC
LIMIT 5;
找出最常被执行的查询
SELECT
query,
calls
FROM pg_stat_statements
ORDER BY calls DESC
LIMIT 10;
匹配特定表或关键词的查询
通过正则匹配筛选跟某表相关的执行语句:
SELECT
query,
calls,
total_exec_time
FROM pg_stat_statements
WHERE query LIKE '%your_table_name%'
ORDER BY total_exec_time DESC;
重置统计数据
如果需要清理历史查询统计记录:
SELECT pg_stat_statements_reset();