POSTGRESQL AUTO_EXPLAIN 记录慢语句的执行计划

本文介绍如何使用PostgreSQL的auto_explain模块自动记录慢查询的执行计划,包括配置参数详解及注意事项。

b505a7eb0f6f69ca9a250946b955e0f8.png

在数据库的执行SQL的语句中,有很多语句在执行中,执行计划会变化,而执行计划的变化会导致SQL 语句执行时间的变化,如何对在POSTGRESQL 中执行较慢的语句。

auto_explain 模块提供一种自动记录慢语句的执行计划的功能,使用这个功能的同时需要注意,任何功能的开启都需要负担一定的性能损耗,在损耗的情况下,我们应该判断是否开启这个功能。

我们需要在下面的这个位置,将auto_explain 填入到 local_preload_libraries ,并且重启数据库服务器。

0b7598bd65fb4a321e48434f81ba45e7.png

除此以外如果要auto_explain 能良好的完成工作,POSTGRESQL 针对auto_explain 有几个参数需要修改,下面我们一个一个说

cd8219d8da0f295936348923482f5ee0.png

1   auto_explain.log_min_duration 

这个参数是启动auto_explain的核心参数,除了在local_preload_libraries 中需要加载auto_explain, 启用这个功能的另一个核心参数就是 auto_explain.log_min_duration. 这个参数代表了决定了超过多长时间的慢SQL 语句需要对执行计划进行记录,默认是-1 ,表名不记录任何慢语句。

2   auto_explain.log_analyze

这个参数主要是在输出的内容上进行调整,如果不写这个参数则输出的内容仅仅是 explain 的内容,而如果将这个值设置为 ON 则可以打开 explain analyze 的值

3  auto_explain.log_buffers 

这个值是在开启了 log_analyze 后产生的在analzye后打印 buffers的值,默认也是关闭的,在打开 auto_explain.log_analyz 后这个参数的修改才有效。

4  auto_explain.log_timing 

这个值主要控制在打印这个语句执行的时间有多长,这个参数也是 auto_explain.log_analzye 的后置项。

5  auto_explain.log_verbose

这个值主要控制 explain 中的verbose 信息的信息输出。

03eecfea51a48484cf4507c818ce76d1.png

我们执行一个SQL 查看在调整参数并重启后,日志中开始出现慢查询的执行计划的信息。

30f946aab73ee6e205e3af931b5ca500.png

实际上我们也可以修改打印的信息的格式,修改日志输出格式后,整体

47e3b1552878349c98ec0543d8f39455.png


相关 auto_explain功能就直接启用了。那么 auto_explain有什么劣势或者在使用中需要考虑的点

1  PG 中的慢查询和auto_explain 中的log_min_duration 应该设置成一个值吗?

这个问题实际上,个人人为不应该设置成一个值,而是应该设置为一个比 log_duration 更大的值。主要原因是,功能的不同,查看慢查询的执行计划本身并不应该针对每一个慢查询,而是应该对应与一些较长时间执行的SQL 如我们默认 1秒的SQL 就要记录在慢查询记录中,但是我们不应该将慢查询执行计划也设置成一秒,而应该讲时间拉长,例如 10秒,超过10秒的语句我们才需要查看他的实际执行计划,如果将每个超过1秒的语句都记录慢查询分析的话,浪费的日志空间,和消耗的系统IO等资源会比较大。

2  auto_explain 在什么情况下,需要开启 ?

auto_explain本身不适合一些已经运行一段时间的数据库并且数据量较大,平时数据库并没有太大的问题,而是预防一些由于数据量突然加大,导致执行计划和数据表analyze 不匹配导致的临时性的执行计划变化导致的问题,一般这样的语句都有执行时间突然变长的情况,在这样的情况下,适当的查看这个语句的执行计划,并记录当时的执行计划,有助于分析问题。

同时这个功能对于高频的,系统性能已经出现问题的数据库,在上线这个功能时候,需要考虑这个系统是否能承受这个功能带来的一些问题的考虑和前摄

1  系统消耗增多

2  磁盘是否能承载更多的日志

3  这个功能能实际解决问题的场景与你的期望是否契合

4  及时调整截取的SQL 的时间,避免大量的不需要的SQL 的分析被记录的日志。

120550ea94a9ad40ec0ba45a51c16b9e.png

PostgreSQL 中,分析或显示已知 SQL 脚本的执行计划是查询优化的重要手段之一。PostgreSQL 提供了多种方式来查看执行计划,主要包括 `EXPLAIN` 和 `EXPLAIN ANALYZE` 命令。这些命令可以帮助数据库管理员或开发人员理解查询的执行路径、评估性能瓶颈,并据此优化查询语句或索引设计。 ### 显示执行计划 使用 `EXPLAIN` 命令可以显示 PostgreSQL 查询优化器为执行 SQL 语句所选择的执行计划执行计划包括表访问方式(如顺序扫描或索引扫描)、连接方法(如嵌套循环、哈希连接等)以及预期的执行成本等信息。 示例: ```sql EXPLAIN SELECT * FROM employees WHERE department = 'Sales'; ``` 输出可能如下: ``` Seq Scan on employees (cost=0.00..10.00 rows=200 width=48) Filter: (department = 'Sales'::text) ``` 该输出表明优化器选择了顺序扫描来访问 `employees` 表,并应用了一个过滤条件。 ### 显示实际执行计划执行时间 若希望不仅查看执行计划,还希望获取实际执行时间等性能数据,可以使用 `EXPLAIN ANALYZE` 命令。该命令会实际执行查询并返回详细的执行统计信息。 示例: ```sql EXPLAIN ANALYZE SELECT * FROM employees WHERE department = 'Sales'; ``` 输出可能如下: ``` Seq Scan on employees (cost=0.00..10.00 rows=200 width=48) (actual time=0.012..0.345 rows=200 loops=1) Filter: (department = 'Sales'::text) Rows Removed by Filter: 800 Planning Time: 0.123 ms Execution Time: 0.456 ms ``` 此输出不仅展示了执行计划,还提供了实际执行时间、行数统计以及规划时间等信息,有助于更深入地分析查询性能[^2]。 ### 使用扩展工具进行可视化分析 除了使用 SQL 命令外,还可以借助一些图形化工具或扩展来更直观地查看执行计划。例如: - **pgAdmin**:提供图形化界面,支持以树状结构展示执行计划。 - **auto_explain**:PostgreSQL 内置扩展,可记录慢查询的执行计划。 - **explain.depesz.com**:在线工具,可将 `EXPLAIN` 输出可视化,帮助分析查询性能。 启用 `auto_explain` 扩展的示例: ```sql LOAD 'auto_explain'; SET auto_explain.log_min_duration = '1s'; SET auto_explain.log_analyze = true; ``` 这样,所有执行时间超过 1 秒的查询的执行计划都会被记录到日志中。 ### 总结 通过 `EXPLAIN` 和 `EXPLAIN ANALYZE` 命令,PostgreSQL 提供了强大的执行计划分析功能,帮助用户理解查询行为并进行性能优化。结合图形化工具或扩展,可以进一步提升分析效率和可读性。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值