【发布时间】: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