微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

查询提示“NO_PERFORMANCE_SPOOL”被忽略了?

如何解决查询提示“NO_PERFORMANCE_SPOOL”被忽略了?

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

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

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

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

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

解决方法

To quote the great @PaulWhite on this subject

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

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

他还说

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

因此我强烈建议您对该表进行索引以删除线轴

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。