临时表与SQL查询的短路操作

时间:2012-10-16 15:37:06

标签: sql database sql-server-2008 sql-optimization

以下是我想要优化的查询,这里优化的瓶颈是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查询语句中是否有效,如果是,则处理它们的顺序是什么。

1 个答案:

答案 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语句是一个例外。在大多数情况下,保证评估顺序(尽管不涉及聚合时)。

顺便说一句,如果您使用完整查询发布另一个查询,则可能还有其他机会加速查询。