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 の結果が false かどうかを常に評価していると思います。

もっと良い方法があれば誰か教えてください。また、短絡操作は 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ステートメントは 1 つの例外です。ほとんどの場合、評価の順序は保証されます (ただし、集計が関係する場合はそうではありません)。

ちなみに、完全なクエリを使用して別のクエリを投稿すると、クエリを高速化する別の機会が得られる可能性があります。

于 2012-10-16T15:44:29.707 に答える