了解 Postgresql 中的 EXPLAIN 函数
Posted
技术标签:
【中文标题】了解 Postgresql 中的 EXPLAIN 函数【英文标题】:Understanding EXPLAIN function in Postgresql 【发布时间】:2015-10-10 16:49:20 【问题描述】:试图理解 EXPLAIN 函数 - 我有两个查询 - 第一个查询已优化,运行 600 毫秒(我有 100k 行),第二个查询运行 900 毫秒 但是当我运行 EXPLAIN ANALYZE - 第一个快速运行的查询显示我的成本 - 64296 和第二个运行缓慢的查询显示我的成本 - 20873 无法理解为什么更快的查询成本更高,为什么运行时间更长的查询成本更低。 有人可以给我一些提示吗?
【问题讨论】:
可能是因为优化器迷糊,第二次查询选择了错误的执行计划。 【参考方案1】:PostgreSQL EXPLAIN
是一种真的有很多胳膊和腿的动物,每条腿都会导致它以一种起初难以理解的方式工作。
为了回答您的问题,我了解虽然运行第一个查询 Q1(不是它的 EXPLAIN
),但它比第二个(Q2)运行得更快,但是当您执行 EXPLAIN ANALYSE
时,Q1 实际上具有更高的成本.
此刻我能想到两个原因:
如果查询是LIMIT
查询,那么 Q1 可能执行得更快并且仍然具有更高的“成本”,因为 PostgreSQL 规划器(有意地)没有计划更小的总成本,而是所需成本的更小结果(在这种情况下,行数较少)。
另一个原因可能是缓存可能会破坏您的时代。您能否通过多次 (3+) 次运行确认观察是否持续存在?
除了这些预感之外,如果你真的想深入了解EXPLAIN
,建议你参考以下文章here、here和here。
【讨论】:
【参考方案2】:成本是规划者对执行查询需要多少资源(I/O 和 CPU 时间)的考虑。这只是一个估计,由数学模型计算得出。
在您的情况下,计划员错了,它选择了次优计划。它有时会发生。
为什么?可能有很多原因。也许统计数据不足(首先尝试为您的表运行analyze
)。也许统计数据是好的,但是规划器使用了错误的模型(例如,您的查询中可能有相关的谓词,这些谓词已知是有问题的)。也许您的查询涉及几十个表,而规划器无法遍历所有可能的计划。以此类推。
【讨论】:
以上是关于了解 Postgresql 中的 EXPLAIN 函数的主要内容,如果未能解决你的问题,请参考以下文章
PostgreSQL学习系列—EXPLAIN ANALYZE查询计划解读
PostgreSQL 的 EXPLAIN ANALYZE 的 MySQL 等价物是啥
PostgreSQL EXPLAIN ANALYZE 的 MySQL 等价物是啥