我想实现从连接表中获取特定列的数据的逻辑,但如果失败,则回退到子查询:
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
运算符。
请帮助我理解该计划。是否有“有条件地进入嵌套循环”之类的事情?看起来最后一个嵌套循环调用底部分支,不管......我需要重写查询吗?
CASE 表达式按顺序计算其条件并停止 满足第一个条件
因此仅当第一个条件为 false 时才会运行选择