SQL Server 中 SELECT 子句子查询是只在必要时才执行吗?

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

我想实现从连接表中获取特定列的数据的逻辑,但如果失败,则回退到子查询:

SELECT 
    m.a, m.b,
    CASE 
        WHEN o.c IS NOT NULL 
            THEN o.c
            ELSE (SELECT TOP 1 c FROM other_table 
                  WHERE <predicate over o.* and m.*> 
                  ORDER BY ...)
    END as c
FROM 
    main_table m
LEFT JOIN 
    other_table o ON m.key = o.key

功能上它工作得很好,但我想知道我是否真的从我的

CASE
运算符中获得任何性能优势。我们的想法是,按键匹配几乎适用于所有情况,但对于一小部分行,我们需要回退到更昂贵的
TOP 1
搜索而不是
other_table
。优化器是否足够智能来捕获此逻辑,或者它无论如何都会评估每个输出行的子查询?

我正在尝试从该计划中学习,但说实话,我不太确定如何解释它。

最上面的分支是

LEFT JOIN
,速度超级快。

底部分支是

TOP 1
子查询(本质上是
LEFT JOIN
的变体)。

突出显示的节点是

CASE
运算符。

请帮助我理解该计划。是否有“有条件地进入嵌套循环”之类的事情?看起来最后一个嵌套循环调用底部分支,不管......我需要重写查询吗?

sql-server query-optimization rdbms
1个回答
0
投票

CASE 表达式按顺序计算其条件并停止 满足第一个条件

参见https://learn.microsoft.com/en-us/sql/t-sql/language-elements/case-transact-sql?view=sql-server-ver16

因此仅当第一个条件为 false 时才会运行选择

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