2012-02-09 5 views
0

SELECT:ヘビー使用ネストされたこれらの二つの文は、パフォーマンスの面で同等である場合、私は疑問に思って

ステートメント1:

SELECT 
    ISNULL(T2.COL4, T1.COL4) 
FROM 
    T1 LEFT JOIN T2 ON T1.COL1 = T2.COL1 
    JOIN T3 ON T2.COL1 IS NULL AND T3.COL2 = T1.COL2 OR T3.COL2 = T2.COL2 
WHERE 
    T3.COL3 = @COL3 

書2:

SELECT 
    T1.COL4 
FROM 
    (SELECT 
     ISNULL (T2.COL4, T1.COL4) COL4, 
     ISNULL (T2.COL2, T1.COL2) COL2 
    FROM T1 LEFT JOIN T2 ON T1.COL1 = T2.COL1) T1 
    JOIN T3 ON T1.COL2 = T3.COL2 
WHERE 
    T3.COL3 = @COL3 

2 WHERE句を適用する前にT1 LEFT JOIN T2を "列挙"しているため、2番目の文の方が遅いことを常識的に示唆しています。しかし、それは本当に遅いですか、またはSQL Serverはそれらを最適化して同等にする方法を持っていますか?

2番目の方法はネストされたSELECTだけの醜さを抑制するのに対して、使用する左側の結合から複数の列がある場合は、それを書く最初の方法は本当に厄介なことがあります。

+0

、 'ISNULL(T2.COL1、T1.COL1) 'は次のように書くことができます:' T1.COL1' –

+0

これは正しいです!私はそれを書いたときにそれを単純化しました。私は自分の質問を編集し、ISNULLステートメントの列を変更しました。 –

+0

2つの類似した(より単純な条件の)クエリの 'UNION 'として書き換えることもできます。 –

答えて

1

参加単純な条件を持つ2つのサブクエリのUNIONISNULL()機能の役に立たないだろうクエリを記述するための別の方法:両方のステートメントで

SELECT 
    T2.COL4 
FROM 
    T1 
    JOIN T2 ON T1.COL1 = T2.COL1 
    JOIN T3 ON T3.COL2 = T2.COL2 
WHERE 
    T3.COL3 = @COL3 

UNION ALL 

SELECT 
    T1.COL4 
FROM 
    T1 
    LEFT JOIN T2 ON T1.COL1 = T2.COL1 
    JOIN T3 ON T3.COL2 = T1.COL2 
WHERE 
    T2.COL1 IS NULL 
    AND 
    T3.COL3 = @COL3 
関連する問題