PostgreSQL auto_explain的具体使用

 更新时间:2025年06月17日 08:37:08   作者:脑子进水养啥鱼?  
PostgreSQL auto_explain插件自动记录慢SQL执行计划,支持全局、会话及用户级别加载,具有一定的参考价值,感兴趣的可以了解一下

一、概述

auto_explain 插件可以实现在数据库日志中自动记录慢 SQL 执行计划。PostgreSQL 编译安装时使用了 make world & make install-world 命令,则所有内置插件(包括 auto_explain)会默认被安装到数据库中,可直接调用。在 PostgreSQL 中执行 LOAD 'auto_explain'; 若无报错则表明插件已存在。PostgreSQL 主流稳定版本 9.x 及以上均已支持。

二、使用

2.1 session_preload_libraries 调用(用户级别)

--调用
ALTER ROLE u1 SET session_preload_libraries = 'auto_explain';
ALTER ROLE u1 SET auto_explain.log_min_duration = '3s';

--u1 用户新连入数据库的会话,执行超3s的sql将在数据库日志中打印执行计划
2025-05-27 14:01:10.821 CST [3335] LOG:  duration: 4004.207 ms  plan:
        Query Text: SELECT pg_sleep(4);
        Result  (cost=0.00..0.01 rows=1 width=4)

--取消调用
ALTER ROLE u1 set session_preload_libraries = default;
ALTER ROLE u1 set session_preload_libraries = default;

2.2 LOAD 调用(会话级别)

--调用
LOAD 'auto_explain';
set auto_explain.log_min_duration = '3s';

--当前会话,执行超3s的sql将在数据库日志中打印执行计划
2025-05-27 14:15:03.547 CST [3581] LOG:  duration: 4004.732 ms  plan:
        Query Text: SELECT pg_sleep(4);
        Result  (cost=0.00..0.01 rows=1 width=4)

--取消调用
临时调用,退出当前会话即可。

2.3 shared_preload_libraries 调用(全局级别)

--调用(若未配置环境变量$PGDATA替换为postgresql.conf所在实际路径)
cat >> $PGDATA/postgresql.conf << 'eof'
shared_preload_libraries = 'auto_explain'
auto_explain.log_min_duration = '3s'
eof

psql postgres postgres -c 'checkpoint'
pg_ctl restart

--新连入数据库的会话,执行超3s的sql将在数据库日志中打印执行计划
2025-05-27 14:25:30.559 CST [3884] LOG:  duration: 5005.176 ms  plan:
        Query Text: SELECT pg_sleep(5);
        Result  (cost=0.00..0.01 rows=1 width=4)

--取消调用
sed -i '/^shared_preload_libraries = '\''auto_explain'\''/d' $PGDATA/postgresql.conf
sed -i '/^auto_explain.log_min_duration = '\''3s'\''/d' $PGDATA/postgresql.conf

psql postgres postgres -c 'checkpoint'
pg_ctl restart

三、对比

方式生效范围是否需要重启灵活性适用场景主要缺点
shared_preload_libraries全局长期全局监控需重启,可能资源浪费
LOAD当前会话临时调试手动操作,无法自动化
session_preload_libraries新会话按会话/用户自动启用仅对新会话生效,参数限制

生产环境长期监控:优先使用 shared_preload_libraries,全局配置过滤条件(如 log_min_duration)减少日志量。
临时诊断:使用 LOAD 命令,灵活且不影响其他会话。
特定用户/应用分析:使用 session_preload_libraries,通过连接参数或角色配置实现按需加载。

四、其他参数介绍

详情参考官网:https://www.postgresql.org/docs/current/auto-explain.html

  • auto_explain.log_min_duration (整数):控制执行计划日志记录的最小语句执行时间(单位:毫秒)。设为 0 时记录所有执行计划。默认值 -1 表示禁用日志记录。例如:设置为 250 时,所有执行时间 ≥250 毫秒的语句将被记录。仅超级用户可修改此参数。

  • auto_explain.log_parameter_max_length (整数):控制查询参数值的日志记录方式。默认值 -1 表示完整记录参数值。0 禁用参数值记录。大于 0 时,将参数值截断为指定字节数。仅超级用户可修改此参数。

  • auto_explain.log_analyze (布尔值):启用后,记录执行计划时输出 EXPLAIN ANALYZE 而非普通 EXPLAIN 结果。默认值:off。仅超级用户可修改此参数。

  • auto_explain.log_buffers (布尔值):控制是否在日志中输出缓冲区使用统计信息(等效于 EXPLAIN 的 BUFFERS 选项)。仅在 auto_explain.log_analyze 启用时生效。默认值:off。仅超级用户可修改此参数。

  • auto_explain.log_wal (布尔值):控制是否在日志中输出 WAL 使用统计信息(等效于 EXPLAIN 的 WAL 选项)。仅在 auto_explain.log_analyze 启用时生效。默认值:off。仅超级用户可修改此参数。

  • auto_explain.log_timing (布尔值):控制是否在日志中输出每个节点的定时信息(等效于 EXPLAIN 的 TIMING 选项)。禁用后可减少系统时钟读取开销,适用于仅需实际行数而非精确时间的场景。仅在 auto_explain.log_analyze 启用时生效。默认值:on。仅超级用户可修改此参数。

  • auto_explain.log_triggers (布尔值):控制是否在日志中包含触发器执行统计信息。仅在 auto_explain.log_analyze 启用时生效。默认值:off。仅超级用户可修改此参数。

  • auto_explain.log_verbose (布尔值):控制是否在日志中输出详细执行计划信息(等效于 EXPLAIN 的 VERBOSE 选项)。默认值:off。仅超级用户可修改此参数。

  • auto_explain.log_settings (布尔值):控制是否在日志中输出影响查询规划的修改后配置选项信息(仅显示与内置默认值不同的选项)。默认值:off。仅超级用户可修改此参数。

  • auto_explain.log_format (枚举):指定 EXPLAIN 输出格式。可选值为 textxmljson 和 yaml,默认为 text。仅超级用户可修改此参数。

  • auto_explain.log_level (枚举):设置自动解释查询计划的日志级别。有效值为 DEBUG5DEBUG4DEBUG3DEBUG2DEBUG1INFONOTICEWARNING 和 LOG,默认为 LOG。仅超级用户可修改此参数。

  • auto_explain.log_nested_statements (布尔值):控制是否记录嵌套语句(函数内部执行的语句)。设为 off 时仅记录顶层查询计划。默认值:off。仅超级用户可修改此参数。

  • auto_explain.sample_rate (实数):设置每个会话中仅解释部分语句的比例。默认值 1 表示解释所有查询。嵌套语句要么全解释,要么全不解释。仅超级用户可修改此参数。

到此这篇关于PostgreSQL auto_explain的文章就介绍到这了,更多相关PostgreSQL auto_explain内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • PostgreSQL截取字符串到指定字符位置详细示例

    PostgreSQL截取字符串到指定字符位置详细示例

    这篇文章主要给大家介绍了关于PostgreSQL截取字符串到指定字符位置的相关资料,PostgreSQL数据库拼接字符串函数是一种非常重要的函数,使用它可以方便地将不同的字符串进行拼接操作,从而得到我们需要的结果,需要的朋友可以参考下
    2023-07-07
  • postgresql 实现查询某时间区间的所有日期案例

    postgresql 实现查询某时间区间的所有日期案例

    这篇文章主要介绍了postgresql 实现查询某时间区间的所有日期案例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-01-01
  • PostgreSQL 查看数据库,索引,表,表空间大小的示例代码

    PostgreSQL 查看数据库,索引,表,表空间大小的示例代码

    PostgreSQL 提供了多个系统管理函数来查看表,索引,表空间及数据库的大小,下面详细介绍一下
    2013-08-08
  • CentOS PostgreSQL 12 主从复制(主从切换)操作

    CentOS PostgreSQL 12 主从复制(主从切换)操作

    这篇文章主要介绍了CentOS PostgreSQL 12 主从复制(主从切换)操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-01-01
  • 使用docker compose启动postgresql的示例代码

    使用docker compose启动postgresql的示例代码

    要在启动 PostgreSQL 容器时执行特定的初始化文件,可以使用 Docker 的 docker-entrypoint-initdb.d 目录,这个目录下的 SQL 文件会在容器启动时被自动执行,下面是如何修改 Docker Compose 配置文件,以便在启动时执行初始化 SQL 脚本,需要的朋友可以参考下
    2024-10-10
  • postgresql 实现多表关联删除

    postgresql 实现多表关联删除

    这篇文章主要介绍了postgresql 实现多表关联删除操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-01-01
  • 在docker上部署postgreSQL主从的超详细步骤

    在docker上部署postgreSQL主从的超详细步骤

    使用Docker能够更加高效地部署和管理应用程序,提高开发和运维的效率,下面这篇文章主要给大家介绍了关于在docker上部署postgreSQL主从的超详细步骤,文中通过代码及图文介绍的非常详细,需要的朋友可以参考下
    2024-08-08
  • postgresql数据库如何查看数据中表的信息

    postgresql数据库如何查看数据中表的信息

    这篇文章主要给大家介绍了关于postgresql数据库如何查看数据中表信息的相关资料,要查询数据表信息,需要用到 系统表或系统视图等,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2024-04-04
  • sqoop读取postgresql数据库表格导入到hdfs中的实现

    sqoop读取postgresql数据库表格导入到hdfs中的实现

    这篇文章主要介绍了sqoop读取postgresql数据库表格导入到hdfs中的实现,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-12-12
  • PostgreSql从库重新配置的详情

    PostgreSql从库重新配置的详情

    这篇文章主要介绍了PostgreSql从库重新配置的详情,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-12-12

最新评论