【问题标题】:How to compare two queries?如何比较两个查询?
【发布时间】:2011-04-15 09:47:44
【问题描述】:

我如何比较两个查询 X 和 Y 并说 X 比 Y 好,而它们在小情况下花费的时间几乎相同?

问题是我有两个查询应该在一个非常大的数据库上运行,所以运行和评估不是一个很好的选择。因此,我们创建了一个小型数据库来执行一些测试。评估哪个查询更好是一个问题,因为在我们的测试基础上,它们几乎在同一时间运行(大约 5 分钟)。除了返回所用的时间之外,还有什么方法可以衡量查询的好坏?

【问题讨论】:

标签: sql-server query-optimization


【解决方案1】:
SET STATISTICS IO ON
SET STATISTICS TIME ON

运行查询并比较各种表的逻辑读取和执行时间。

【讨论】:

  • @CombatCaptain 您也可以在 SSMS 中将比较查询堆叠在一起,然后按CTRL+M(包括实际执行计划)然后按F5。然后将鼠标悬停在Actual Execution Plan 选项卡中的第一个节点上并阅读Estimated Subtree Cost
  • 这些说法似乎不受普遍支持。错误 [15001] 在或之前发生语法错误:SET STATISTICS IO ON
【解决方案2】:

如前所述,检查执行计划。

重要的是,通过在每次运行之间清除缓存来公平地比较这 2 个查询,以确保您没有看到由于数据已经被缓存的影响而导致的结果偏差(不要在生产服务器上运行):

DBCC DROPCLEANBUFFERS -- clear data cache
DBCC FREEPROCCACHE -- clear proc plan cache

然后我通常会检查 Reads、Writes、CPU 和 Duration 进行比较。

使用生产级别的数据量进行测试非常重要(理想情况下更大,以了解它的扩展方式)。正是在这些数量上,您才能真正看到任何性能差异。使用小数据量进行测试可能会让您以后遇到问题。

【讨论】:

【解决方案3】:

您检查过查询计划吗?如果查询返回相同的数据并花费相同的时间来执行,我的猜测是查询计划将几乎相同,这意味着两个查询之间没有有意义的差异。

另外,您是否考虑到查询会随着数据库大小的变化而有所不同?

我想知道您是否过早地优化了代码。在我看来,如果我有一个有效且易于理解的查询,我可以通过索引来解决性能问题。这通常比更改查询以提高性能更容易。

【讨论】:

    【解决方案4】:

    在明显不同的数据集上评估查询性能通常没有什么意义。查询计划及其效率可能因数据统计而有很大差异。

    因此,要获得任何现实的估计,您需要一个尽可能接近“真实”的数据库。最重要的是,复制您的“大数据库”并调整您的查询。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-06
      • 1970-01-01
      • 1970-01-01
      • 2019-10-25
      • 2015-03-15
      • 1970-01-01
      相关资源
      最近更新 更多