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

Posted

技术标签:

【中文标题】执行计划中的“查询成本”如何工作?【英文标题】:How is working the "Query cost" in the execution plan? 【发布时间】:2011-08-18 15:25:28 【问题描述】:

我正在尝试提高我的一项请求性能。 我的请求由 10 个不同的选择组成。

实际生产查询需要 36 秒才能执行。

如果我显示执行计划,对于一个选择,我的查询成本为 18%。

所以我用 xml 查询 (http://www.codeproject.com/KB/database/InClauseAndSQLServer.aspx) 更改了 in 子句(在此选择中)。

现在执行新查询需要 28 秒,但 sql server 告诉我上述选择的查询成本为 100%。这是我所做的唯一改变。并且在任何查询中都没有并行性。

生产: 36秒,我的选择是18%(其他都是10%)。

新版本: 28秒,我的选择是100%(其他都是0%)。

你知道 sql server 如何计算这个“查询成本”吗? (我开始相信它是随机的或类似的)。

【问题讨论】:

当然不是随机的;只是缺少你的理解。 感谢您提供这个非常有趣的答案,您介意提高我的知识,这就是我提出问题的目的。 You might find the links in my answer here useful 【参考方案1】:

查询成本是 CPU 周期、内存和磁盘 IO 组合的无单位度量。

您经常会看到成本更高但执行时间更快的运营商或计划。

这主要是由于上述三个组件的速度不同。 CPU 和内存相当快,并且作为瓶颈也不常见。如果您可以将一些压力从磁盘 IO 子系统转移到 CPU,查询可能会显示出更高的成本,但应该会执行得更快。

如果您想获得有关特定查询执行的更多详细信息,可以使用:

SET STATISTICS IO ON
SET STATISTICS TIME ON

这会将有关 CPU 周期、计划创建和页面读取(从磁盘和内存)的详细信息输出到消息选项卡。

【讨论】:

有什么方法可以查看费用详情吗?有没有办法查看每个 select 的执行时间?这与成本有什么关系?这一切的目的是为了缩短执行时间吗? 时间并不总是最重要的因素,尤其是在共享仓库场景中。要查看详细信息,您可以使用我在答案中提到的统计选项。

以上是关于执行计划中的“查询成本”如何工作?的主要内容,如果未能解决你的问题,请参考以下文章

Sql Server中执行计划的缓存机制

MySQL再深入执行计划之trace工具

如何使用SQL PROFILE固定SHARED POOL中的执行计划

Bullet:ORACLE Using SQL Plan Management

如何在 SQuirrel SQL 中查看 Oracle 执行计划?

powershell 如何定时执行 ps1