2

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

4

1 回答 1

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

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

于 2012-10-16T15:44:29.707 回答