本文为云贝教育 刘峰 原创,请尊重知识产权,转发请注明出处,不接受任何抄袭、演绎和未经注明出处的转载。
一、介绍
在本文中,我们将了解 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(它会动态生成执行计划),