Statements 统计分析

Statements 统计分析

pg_stat_statements 是 ProtonBase 提供的一个强大的统计扩展,允许用户跟踪和分析 SQL 查询的执行情况。这对于性能优化、慢查询跟踪和理解数据库负载有极大的帮助。

pg_stat_statements中的查询文本会被“规范化”处理,相同逻辑的 SQL(带不同参数)会合并统计,如 SELECT * FROM table WHERE id = $1

场景简介

pg_stat_statements 的典型使用场景包括:

  1. 定位性能瓶颈:识别执行耗时最长或资源消耗最大的 SQL。
  2. 优化查询:找到低效的查询(如频繁全表扫描或缺少索引的语句)。
  3. 监控数据库负载:跟踪数据库的慢查询和请求模式。
  4. 容量规划:了解最常被访问的表或最大资源消耗的查询模式,以规划未来优化任务。

加载扩展

  1. 加载扩展,首先在数据库中启用扩展,需要具备系统管理员权限执行,扩展的详细介绍,参考pg_stat_statements
CREATE EXTENSION pg_stat_statements;
  1. 启用成功后,会在 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();