未找到足够好的计划的查询


20

我有一个SQL Server 2012数据库。我注意到Reason for early termination of statement optimization某些查询的价值,而所有查询都给出Good Enough Plan Found。现在我的问题是:

  1. 什么是“提早终止语句优化的原因”的所有可能类型。我确实在msdn中进行了搜索,但没有完整的值列表。
  2. 是否有DMV或扩展事件列出了由于找到了“足够好的计划”以外的原因而终止优化的所有查询?我引用了以下两篇文章,其中未列出所有可能性。[此外,它们在我的数据库中给了我不同的结果]。

在此处输入图片说明


Answers:


20
  • 超出内存限制

    由于内存压力,优化器被迫停止寻找更好的计划替代方案。应对此原因进行调查和更正,然后再次尝试查询编译。如果不存在内存不足的情况,返回的计划很可能不是优化程序会选择的计划。

  • 超时

    这个原因被很多人误解了

    查询优化器旨在快速找到合理的计划。它不会进行详尽的搜索以找到最佳的计划。通过设计,它避免在优化上花费不必要的更多时间。确保超时的这些功能之一就是“超时”(不是时间的度量)。

    优化器根据逻辑查询的复杂性,基数估计以及到目前为止找到的最便宜的计划(如果有)的估计成本,为自己设置一个“探索预算”。具有更高基数的更复杂查询将获得更高预算。

    如果在其搜索阶段之一中超出此预算,则该阶段结束。这是优化器设计和正常操作的一部分。需要更多优化器工作的查询就可以了;那些不,不要。

    将“超时”视为“找到足够好的计划”。

  • 找到足够好的计划

    这与空白原因完全相同。成本低于0.909090 ...(1 / 1.1)的计划以这种方式标记只是一个历史怪癖。当出现此原因时,一切不会尽早停止或在优化程序代码中进行特殊处理或有所不同。

除了“超出内存限制”之外,“提前终止的原因”对于查询调整或性能分析都没有多大意义(如果有的话)。我通常会忽略它们。

忠告

根据实际性能指标(经过的时间,CPU /内存使用情况……在上下文中重要的内容)来确定查询调整工作的目标。如果查询对于其预期目的而言太慢,请花一些时间使其加快速度。测量实际性能,将其与基线和历史记录进行比较,并针对重要差异调整目标。

将具有保证的干净数据存储在适当的关系模式中,其中包含有用的统计信息和索引以及编写良好的优化程序友好查询。


10

如果转到http://schemas.microsoft.com/sqlserver/2004/07/showplan/showplanxml.xsd(如果您以xml格式打开执行计划,则将看到该链接),您将看到列出了三个原因,分别是:

  • 超时
  • 超出内存限制
  • 好的计划

您提到的文章似乎可以找到这些事件,您是否有特定的问题?唯一要记住的是,这些DMV不会捕获服务器上曾经运行的所有SQL命令,并且在服务器重新启动时会重置。您可以使用扩展事件来捕获showplan xml并对其进行查询,但是对我来说似乎有点过头了。

我也不会太担心GoodEnoughPlanFound,似乎优化器正在很好地完成其工作(快速找到一个好的计划)。

高温超导

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.