SQL Server是否足够聪明,如果不需要,则不执行昂贵的查询? (短路)

问题描述 投票:0回答:1

因此,SQL Server不会像通用编程语言中的if语句那样以显式方式进行短路。

因此,请考虑以下模型查询:

SELECT * FROM someTable
WHERE name = 'someValue' OR name in (*some extremely expensive nested sub-query only needed to cover 0.01% of cases*)

假设表中只有3行,并且所有这些行都匹配name ='someValue'。昂贵的子查询会运行吗?假设有300万行,除了1行以外,其他所有行都可以使用name ='someValue'来获取,而第一行需要通过子查询来获取。是否会在不需要子查询时对其进行评估?

[如果有类似的真实情况,则可以让0.01%等待昂贵的子查询运行,然后再获取结果,只要快速获取结果而没有99.99%的子查询就可以了。案件。(我知道上面的特定示例可以通过SP中的IF语句显式处理,如以下相关线程中所建议:Sql short circuit OR or conditional exists in where clause但让我们假设这不是一种选择。)

sql sql-server short-circuiting short-circuit-evaluation
1个回答
0
投票

正如评论所指出的那样,SQL Server中的优化器非常聪明。

您可以使用case尝试短路。由于documentation状态:

CASE表达式按顺序评估其条件,并从满足条件的第一个条件停止。

请注意,有一些涉及聚合的例外情况。因此,您可以这样做:

SELECT t.*
FROM someTable t
WHERE 'true' = (CASE WHEN t.name = 'someValue' THEN 'true'
                     WHEN t.name in (*some extremely expensive nested sub-query only needed to cover 0.01% of cases*)
                     THEN 'true'
                END)

这种强制排序通常被认为是一个坏主意。一个例外是当其中一个路径可能涉及错误(例如类型转换错误)时;但是,这通常在现今已通过try_函数修复。

[在您的情况下,我怀疑用IN替换EXISTS并使用适当的索引可能消除了子查询的几乎所有性能损失。但是,这是另一回事。

© www.soinside.com 2019 - 2024. All rights reserved.