PostgreSQL 里的 pg_stat_statements 扩展是用来收集查询统计信息的工具。它能让你看到哪些查询最常被执行,哪些查询最耗时,以及数据库资源用得怎么样。你不用再用 EXPLAIN 手动分析每个查询,而是可以直接看到数据库整体的性能状况。
用 pg_stat_statements 的好处:
实时监控:你可以直接看到现在哪些查询在给数据库带来压力。
全局性能分析:所有查询的信息都能看到,不用手动挑着分析。
查找慢查询:很容易就能找出最耗时的查询。
发现重复查询:可以优化缓存,给热门查询加索引。
安装和配置 pg_stat_statements
现在你已经知道 pg_stat_statements 有啥用了,下面我们一步步来看看怎么安装和配置它。
1. 检查 PostgreSQL 是否支持。 先确认你的 PostgreSQL 支持 pg_stat_statements 扩展。从 PostgreSQL 9.2 开始,这个扩展就是标配了。要检查扩展有没有装,执行:
SELECT extname FROM pg_extension;
如果 pg_stat_statements 不在列表里,说明管理员还没装它。
装好并激活扩展后,应该是这样的:
| extname |
|---|
| plpgsql |
| pg_stat_statements |
我们现在学的是 PostgreSQL 17.5,所以没问题。但你以后去公司上班,可没人保证用的是最新版服务器。说不定已经 10 年没人升级过了。毕竟程序员的头号原则是啥?能用就别动。
2. 添加扩展。
要激活 pg_stat_statements,得把它加到 PostgreSQL 的预加载库列表里。这要在 postgresql.conf 配置文件里设置。
步骤如下:
- 找到
postgresql.conf文件。一般在 PostgreSQL 的数据目录下。 - 打开它编辑。
- 加上或修改这一行:
shared_preload_libraries = 'pg_stat_statements'
为啥要这样?因为 pg_stat_statements 需要预加载,才能在系统层面跟踪查询。
保存后重启 PostgreSQL 服务器,让设置生效。Linux 下命令如下:
sudo systemctl restart postgresql
如果你本地开发或测试,直接重启服务器也行。
3. 在数据库里创建扩展。 PostgreSQL 服务器重启后,我们可以在具体的数据库里创建 pg_stat_statements 扩展。用 psql 或别的工具连上目标数据库,执行:
CREATE EXTENSION pg_stat_statements;
如果没报错,说明扩展已经激活了。
4. 配置 pg_stat_statements 参数。
装好扩展后,最好配置下参数,保证统计数据收集得更准确。主要参数可以在 postgresql.conf 文件里设置。
主要参数
pg_stat_statements.track- 决定哪些查询会被跟踪。
- 可选值:
all— 跟踪所有查询(调试和分析推荐)。top— 只跟踪顶层查询。none— 不跟踪。
- 配置示例:
pg_stat_statements.track = 'all'
pg_stat_statements.max- 设置统计里最多能保存多少条查询。
- 默认:5000。
- 如果你系统查询很多,可以调大,比如:
pg_stat_statements.max = 10000
pg_stat_statements.save- 决定重启服务器后统计数据要不要保留。
- 可选值:
on或off。 - 建议保持
on:pg_stat_statements.save = on
改完参数后,再重启一次 PostgreSQL 服务器。
检查 pg_stat_statements 是否正常
扩展装好并配置后,我们来看看它是不是在正常工作。要看收集到的查询统计,执行下面这个查询:
SELECT
queryid, -- 查询的唯一标识
query, -- 查询文本
calls, -- 查询被调用的次数
total_time, -- 总执行时间(毫秒)
rows -- 查询返回的行数
FROM pg_stat_statements
ORDER BY total_time DESC;
这些字段都啥意思?
queryid:查询的唯一 ID,方便找出参数不同但结构一样的查询。query:执行过的 SQL 查询文本。calls:这个查询被执行了多少次。total_time:所有调用加起来的总耗时。rows:查询一共返回了多少行。
比如你看到某个查询 calls = 100,total_time = 50000(50 秒),那它就是系统里最耗时的,得赶紧优化。
pg_stat_statements 的常见用法
- 查找最慢的查询。 要找出最耗时的查询,把结果按
total_time排序:
SELECT query, total_time, calls
FROM pg_stat_statements
ORDER BY total_time DESC
LIMIT 5;
- 找出最活跃的查询。 要看哪些查询最常被执行,用
calls排序:
SELECT query, calls, total_time
FROM pg_stat_statements
ORDER BY calls DESC
LIMIT 5;
- 分析索引使用情况。 如果你发现很多查询很慢,检查下索引用得好不好。比如有
WHERE过滤条件但没索引,性能肯定差。
清空 pg_stat_statements 的数据
有时候你想把统计数据清零,重新开始分析。可以用这个命令:
SELECT pg_stat_statements_reset();
清空后,所有统计都会被重置,数据会重新收集。
实用建议
限制统计数据量:如果你在高并发系统里,每天有几百万条查询,pg_stat_statements.max 别设太大,避免额外负担。
定期清理统计:分析性能前最好先清空统计,别让旧数据干扰新分析。
关注慢查询:哪怕某些慢查询很少出现,一次慢查询也可能让数据库压力山大。
现在你已经知道怎么安装、配置和用 pg_stat_statements 扩展来分析查询性能了。下一节课我们会深入讲怎么用它找出慢查询并优化它们的执行。
GO TO FULL VERSION