【技术文章】PostgreSQL AUTO_EXPLAIN - 慢速查询的日志执行计划

本文为云贝教育 刘峰 原创,请尊重知识产权,转发请注明出处,不接受任何抄袭、演绎和未经注明出处的转载。

一、介绍

在本文中,我们将了解 PostgreSQL AUTO_EXPLAIN功能的工作原理,以及为什么应该使用它来收集在生产系统上执行的 SQL 语句的实际执行计划。

二、SQL执行计划

当您向 PostgreSQL 发送 SQL 语句时,该语句的执行方式如下图所示:

图片

首先,基于文本的 SQL 语句被解析为可由数据库服务器以编程方式遍历的抽象语法树(例如查询树)。 

其次,优化器使用查询树生成最佳执行计划,该执行计划消耗最少的资源来生成所需的结果。  

第三,执行器运行执行计划,并将输出作为查询结果集返回给客户端。

三、估计执行计划和真实的执行计划

当您使用 EXPLAIN 命令时。PostgreSQL 仅返回估计执行计划,即优化器认为对于所提供的 SQL 语句最有效的计划。但是,当您运行 EXPLAIN 命令时,该语句并未真正执行。  

另一方面,如果我们运行 EXPLAIN ANALYZE,PostgreSQL 会运行该语句,因此我们将得到实际执行计划,其中还包含执行计划中每个操作的计时信息。  

在研究生产系统上的慢速查询时,我们可能会面临几个挑战。  

  • 首先,出于安全原因,我们可能不允许在生产系统上运行查询,因此,在这种情况下,我们不能简单地运行 EXPLAIN ANALYZE 命令来获取实际执行计划。  

  • 其次,即使我们有权运行 EXPLAIN ANALYZE 命令,我们也可能会观察到与客户抱怨的计划不同的计划。这可能是由于几个原因造成的。  

例如,PostgreSQL 有一个prepareThreshold 设置,其默认值为5。该值告诉PostgreSQL 在切换到使用通用计划的服务器端Prepared Statement 之前,它可以在客户端模拟Prepared Statement 多少次。  

如果慢速查询使用通用计划,即使运行 EXPLAIN ANALYZE(它会动态生成执行计划),

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值