这个扩展做什么
auto_explain 是 PostgreSQL 的扩展模块:语句耗时超过阈值时,自动把它的执行计划写进日志,还可以附带实测耗时、行数与缓冲区统计。事后分析线上慢查询时不用再手工复现。它通过 shared_preload_libraries 预加载,属于服务端级别的诊断工具。
基本信息
| 生效方式 | shared_preload_libraries 需重启;其余参数支持会话级 SET 或改配置后 reload |
|---|---|
| 记录阈值 | auto_explain.log_min_duration 决定记录哪些语句 |
| 实测数据 | log_analyze 按 ANALYZE 方式采集,有少量额外开销 |
| 缓冲区 | log_buffers 附带缓冲区统计,定位读放大 |
| 本地调试 | 会话内把阈值设为 0,可记录当前会话全部语句 |
典型使用场景
- 线上慢查询的事后分析,不用手工复现
- 排查只在特定参数下才慢的语句
- 定位读放大,看是共享块命中还是读盘
- 对比一次发布前后的计划差异
- 测试环境用会话级设置,只记录自己的语句
全局配置
全局配置
shared_preload_libraries = 'auto_explain' # 必须预加载,改完要重启实例
auto_explain.log_min_duration = '1s' # 记录超过 1 秒的语句,-1 表示关闭
auto_explain.log_analyze = on # 附带实际耗时与行数
auto_explain.log_buffers = on # 附带缓冲区统计
auto_explain.log_nested_statements = on # 也记录函数内部的语句会话级调试
会话级调试
-- 只在当前会话生效,适合在测试环境复现问题
SET auto_explain.log_min_duration = 0; -- 记录本会话的全部语句
SET auto_explain.log_analyze = on;
SET auto_explain.log_buffers = on;
-- 确认日志写到哪里,再去对应目录里找
SHOW log_directory;
SHOW log_filename;关键参数读法
| 参数 | 作用 | 注意 |
|---|---|---|
| log_min_duration | 记录多久以上的语句 | 设得太低会让日志爆炸 |
| log_analyze | 用 ANALYZE 方式采集实测数据 | 有额外开销,高峰期慎用 |
| log_buffers | 记录缓冲区使用情况 | 用来判断读放大与缓存命中 |
| log_nested_statements | 记录函数内部语句 | 排查函数里藏着的慢查询 |
| log_format(12+) | 输出格式,可选结构化格式 | 需要程序化解析时优先选 json |
log_analyze 会带来额外开销:每记录一条都要采集实测数据,如果对所有语句都开启会把负载放大。只在排查期打开,并用阈值把范围限制在真正慢的语句上。
忘了预加载就什么输出都没有:只把 log_min_duration 调小、却没把 auto_explain 放进 shared_preload_libraries 并重启,模块根本没加载,容易误判成「没有慢查询」。