【问题标题】:Query hint 'NO_PERFORMANCE_SPOOL' being ignored?查询提示“NO_PERFORMANCE_SPOOL”被忽略?
【发布时间】:2021-06-17 02:16:24
【问题描述】:

我在供应商的大型 SQL Server 数据库中工作,我的任务是从那里存储大量数据。服务器是 SQL Server 2017 (14.0.3391.2),运行查询的数据库设置为兼容级别 140。

我有几个查询,其中优化器决定在查询计划中使用惰性/急切索引假脱机。过去(SQL Server 2016 向前)我已经能够使用“NO_PERFORMANCE_SPOOL”的查询提示轻松防止这种情况。在过去,这总是导致查询计划中的所有索引假脱机被删除。 由于某种原因,在数据库中应用该提示时,索引假脱机仍保留在执行计划中? 我知道我正在查看实际的执行计划(在允许查询执行后在 SSMS 中提供的查看计划) “包括实际执行计划”已选中)。我还没有找到任何其他有据可查的人声称这发生在他们身上的例子,所以这让我相信我错过了什么?我知道如果无法使用提供的提示生成计划,则可以忽略提示(甚至导致错误),但我无法想象这里会出现这种情况? 我不明白如何可能需要索引假脱机才能编译计划?我的提示是否因为某种原因被直接忽略了?

所以我有点茫然。我知道我可以使用其他方法(例如重写查询或添加索引)来消除索引假脱机,但目前我对此不感兴趣。我只是想知道为什么这个查询提示似乎被忽略了?

PS:对于任何想知道的人,当使用使用索引假脱机的计划时,这些查询会受到很大影响。该服务器通常会遇到 I/O 瓶颈和资源信号等待(与内存授予有关。同样,不是我的服务器/问题),因此索引假脱机最终成为一个大问题。

PS PS:我会发布查询计划,但我认为数据结构/命名和生成的查询计划是供应商专有的。另外,我认为这里真的不需要它。如果有人认为这可能会有所帮助,那么我可以做更多的工作,看看我是否可以使用 AdventureWorks 或其他东西重新创建。

【问题讨论】:

  • 什么是数据库兼容级别?您是否考虑过正确的索引以移除线轴
  • @Charlieface,这两个问题都在 OP 中得到解决。数据库兼容级别为 140。我知道使用其他方法摆脱线轴的方法,但我想弄清楚为什么提示本身没有将它们从计划中删除。我看到的所有文档都说,当指定“NO_PERFORMANCE_SPOOL”提示时,计划不应再包含它们。
  • 对,抱歉错过了。是否有机会在编译器尝试验证外键约束的地方插入/更新/删除?请通过brentozar.com/pastetheplan分享查询计划,您可以使用 SentryOne 计划浏览器将其匿名化
  • 抱歉耽搁了。我没有一个可以举起的好例子,但我今天在工作中找到了一个好例子。感谢您提供有关 SentryOne 计划资源管理器的提示。我已上传匿名计划。可以在这里看到:brentozar.com/pastetheplan/?id=Sy8ujPSpd 另外,我不认为这可以在匿名计划中看到,但原始查询是使用以下 OPTIONS 子句运行的:OPTION(FORCE ORDER,NO_PERFORMANCE_SPOOL,RECOMPILE)

标签: sql-server sql-server-2017


【解决方案1】:

To quote the great @PaulWhite on this subject:

虽然急切索引假脱机可能只出现在嵌套循环应用的内侧,但它不是“性能假脱机”。 无法使用跟踪标志 8690 或 NO_PERFORMANCE_SPOOL 查询提示禁用急切索引假脱机。

性能假脱机是“惰性假脱机”,而不是急切假脱机,并使用不同的优化规则放置在那里。

他也说

在某些方面,急切的索引假脱机是最终缺少的索引建议

因此,我强烈建议您将该表编入索引以移除假脱机

【讨论】:

  • 谢谢!阅读提供的链接(以及在您提供的链接中找到的sqlperformance.com/2019/09/sql-performance/…)后,它更有意义。
  • 我想我没有足够的声望分数来投票,但我已经接受它作为答案。当我获得更多声誉时,我一定会回来投票。
猜你喜欢
  • 1970-01-01
  • 2020-05-26
  • 2013-04-13
  • 2013-09-04
  • 2014-11-20
  • 2013-03-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多