Oracle 执行计划:成本与实际问题:成本较高的查询运行得更快

Posted

技术标签:

【中文标题】Oracle 执行计划:成本与实际问题:成本较高的查询运行得更快【英文标题】:Oracle Execution plan: Cost vs Actual issue: Query with higher cost runs faster 【发布时间】:2014-08-28 10:35:30 【问题描述】:

我知道这个问题以前被问过很多次,但没有一个明确的答案。

Here

Here

在我的例子中,我的 DBA 优化了一个大约需要 1.05 分钟才能执行的选择查询。我通过在 1 秒内运行进行了进一步的改进。但是我优化的那个在执行计划中成本更高。我的 DBA 建议,因为我的查询成本更高,我们不应该更改查询。

我知道两个查询的执行计划不具有可比性。但是我应该如何说服我的 DBA 理解执行计划是一个“计划”但结果是“实际的”

谁能指出我正确的方向

【问题讨论】:

您的 DBA 还应该知道,比较成本只对同一查询的不同计划有意义,而不是对不同的查询有意义,即使它们最终得到相同的结果集。还有那个cost has no unit of measurement。 @AlexPoole 是的,我想他应该知道。但是有什么发现,我可以用文档来反驳他的论点 像往常一样,start with Tom Kyte。但也要确保您不仅看到了第一个查询缓存了第二个查询然后使用的数据的好处;多次运行并交错运行以检查时间是否一致。 @AlexPoole 是的,我做了很多次,结果都一样。 【参考方案1】:

作为Tom Kyte says:

您无法相互比较 2 个查询的成本。他们根本不是 可比。

...

如果我们得到另一个查询——另一个类似的查询——我们会执行相同的步骤,构建 很多计划,分配一个成本,从那一组中选择成本最低的一个。

但是,我们不能接受这 2 个查询并将每个查询的相对成本与 其他。这些成本特定于这些查询。

很多因素都会影响查询的“成本”。 “成本”只是一些人为的数字 我们到达选择一个给定环境的查询。 ...

不要比较它们,你不能——它们还不如随机数。

DBA 应该已经知道这一点,任何尝试调整查询的人都应该知道(你在问题中说过你这样做了)。他们也应该知道相信汤姆的意见。

【讨论】:

【参考方案2】:

计算的成本是过去计算的统计结果,也取决于配置。例如,如果您设置了 optimizer_index_cost_adj ,那么它将影响成本,但不会影响执行查询所需的实际时间。第二旧的统计数据已经第二旧,不再是 100% 准确。

另一方面,当您测量查询的执行时间时,测量的时间取决于您的缓存命中率。您当然可以在每次查询之前刷新所有缓存,但这与实际情况不同。所以当你声称你的语句需要 1.00 秒而不是 1.05 秒时要小心。因为你可能只是在你的实验室里做不属于你的现实的实验。

【讨论】:

以上是关于Oracle 执行计划:成本与实际问题:成本较高的查询运行得更快的主要内容,如果未能解决你的问题,请参考以下文章

执行计划中的“查询成本”如何工作?

Bullet:ORACLE Using SQL Plan Management

Oracle固定SQL的执行计划---SQL Profile

PMP挣值计算公式汇总

SAP如何计算实际成本

Oracle里收集与查看统计信息的方法