联系管理员

开通文章发布权限

扫码 添加微信
微信图片
电话:15897897836 QQ:2106973531

Auto_explain原理探究

auto_explain是一个自动记录“慢sql”执行计划到数据库日志的插件,这样就不需要手动去执行explain分析sql的执行计划了。特别是对于大型应用未优化的sql的追踪,以及一些历史sql性能问题的溯源是很有帮助的。

前言

顾名思义,就是自动执行explain,我们可以推测下它的原理:插件的hook函数去调用explain对应的逻辑,然后打印执行计划到数据库日志。
如下示例,开启相关参数,执行sql时执行计划自动记录到了日志中。
image
image

原理

启用auto_explain,需要将其配置到shared_preload_libraries参数,这样在主进程启动时就会加载插件对应的so文件,初始化自定参数和hook函数。
生成执行计划是在planner里进行的,auto_explain只是在Execute阶段将计划打印出来,显式explain也是同理,只是打印计划。
当开启插件后,在sql执行阶段,ExecutorEnd函数中判断如果已经注册了hook函数,则进入explain_ExecutorEnd
如果sql执行时间msec >= auto_explain.log_min_duration参数,则进入后续打印执行计划逻辑。
进入关键函数ExplainPrintPlan调用ExplainNode,调用InstrEndLoop(planstate->instrument)计算当前plan node运行的starttime totaltime等信息。如果auto_explain.log_analyze参数为on,则计算当前plan node对应的startup_ms,total_ms,rows,nloops然后调用appendStringInfo(es->str)来传参拼接“actual time”信息。
从计划树自上而下每个node进行上述打印处理,将所有node处理结果放到一个字符数组,最终调用ereport()将整个字符数组也就是完整的执计划打印到数据库日志中。
image
debug关键过程:
explain_ExecutorEnd函数中:判断msec >= auto_explain.log_min_duration,且auto_explain.log_analyze为on
image
ExplainNode函数中:根据planstate->instrument计算出当前node运行的startup_ms,total_ms,rows,nloops,并且调用appendStringInfo(es->str)来传参拼接“actual time”
image
image
所有node处理完后,通过ereport()打印到日志。
image

小结

简单总结下auto_explain的原理:sql执行时插件的hook函数去调用explain对应的逻辑,然后打印执行计划到数据库日志。
不过,值得注意的是使用该插件会带来一些性能开销,详情可参考《auto_explain 的开销有多大》

相关文章

从安装PostgreSQL开始
通过以下步骤,你可以在 CentOS 7 上成功安装和配置 PostgreSQL 14。首先,设置 RPM 仓库并安装 PostgreSQL 14 服务器。然后,创建自定义数据存储目录并初始化数据库。接下来,修改启动脚本以使用自定义数据存储目录,并设置 PostgreSQL 监听所有 IP 地址。为了增强安全性,配置密码认证并修改 postgres 超级用户密码。最后,确保所有配置生效,重启 PostgreSQL 服务。通过这些步骤,你将拥有一个配置良好且安全的 PostgreSQL 数据库环境。如果在过程中遇到任何问题,请参考官方文档或寻求专业支持。
checkpoint是什么东西?一个位置?还是一个操作?
checkpoint是一个操作,执行这个操作的开始时刻,会记录当前开始时刻的 WAL 位置作为重做点,这个位置会被保存在文件中。 然后将该重做点之前所有 shared buffer 中的脏页均被刷入到存储。checkpoint又名检查点,一般checkpoint会将某个时间点之前的脏数据全部刷新到磁盘,以实现数据的一致性与完整性。
PostgreSQL 内参:深入解析运行原理【快照篇】
来源于灿哥的:《PostgreSQL 内参:深入解析运行原理》,非常好的一本书。
PG存在的级联删除(ON DELETE CASCADE)
在 PostgreSQL 中,如果你有两张表:用户表(users)和订单表(orders),并且用户表的主键是订单表的外键,那么你可以通过以下步骤来进行实验,删除订单表中的一条数据,然后删除用户表中的一条数据。

评论

快捷导航

把好文章收藏到微信

打开微信,扫码查看

关闭

还没有账号?立即注册