以下是我想要优化的查询,这里优化的瓶颈是CONDITION_B。
select @COMPUTE_X = count(distinct TABLEA.COLUMN_T5)
from #TMP_TABLEA TABLEA
inner join TABLEB on TABLEB.ID = TABLEA.ID
left join....
where
(
CONDITION_A --Complex condition
) and
(
CONDITION_B --Complex condition with some functions returning table
)
如果我把上面的查询结果留给CONDITION_B到临时表,然后在该临时表上应用CONDITION_B,我获得了非常好的性能提升。我认为CONDITION_B总是评估CONDITION_A的结果是否为假。
有没有人让我知道是否有更好的方法。并且短路操作在SQL查询语句中是否有效,如果是,则处理它们的顺序是什么。
答案 0 :(得分:1)
强制执行评估顺序的唯一方法是使用CASE
语句。虽然它可能看起来不漂亮,但以下可能具有相似的性能:
select @COMPUTE_X = count(distinct TABLEA.COLUMN_T5)
from #TMP_TABLEA TABLEA
inner join TABLEB on TABLEB.ID = TABLEA.ID
left join....
where 1 = (CASE WHEN CONDITION_A then 1
WHEN CONDITION_B then 1
else 0
end)
请记住,SQL是一种描述性语言,而不是一种过程语言。您编写SQL来描述所需的结果。查询优化器可以完全重新排列您在语句中放置内容的顺序。但是,CASE
语句是一个例外。在大多数情况下,保证评估顺序(尽管不涉及聚合时)。
顺便说一句,如果您使用完整查询发布另一个查询,则可能还有其他机会加速查询。