1

私はかなり定期的にISNULLand COALESCEinON句を使用していますが、インデックスが使用されない可能性があるため、最適化の問題が発生する可能性があることを読みました。

私は現在、次のものを持っています:

FROM  dbo.tb_xxx x
      INNER JOIN dbo.tb_yyy y ON        
        x.Client    = COALESCE(y.Client, x.Client) AND
        x.Prod  = COALESCE(y.Prod, x.Prod)

...次のように変換しました...

FROM   dbo.tb_xxx x
       INNER JOIN dbo.tb_yyy y ON       
        x.Client    = y.Client AND
        x.Prod      = y.Prod 
        OR y.Client IS NULL
        OR y.Prod IS NULL

これらは同等ですか?
そうでない場合、なぜですか?


編集
パフォーマンスに影響を与える可能性があるとは100%ではありませんが、最近Itzik Ben-Ganによるテキストを読みました.col1COALESCE(T1.col1,-1) = COALESCE(T2.col1,-1)の操作はデータが再col1 に構築された既存のインデックスは使用されません。これが「sargability」の概念です。

この一致述語を使用する代わりに、
COALESCE(T1.col1,-1) = COALESCE(T2.col1,-1)
彼はこれを提案します
T1.col1 = T2.col1 OR (T1.col1 IS NULL AND T2.col1 IS NULL)

4

1 に答える 1

4

いいえそうではありません。

あなたが書いたものは同等です

 (x.Client    = y.Client AND x.Prod      = y.Prod)
    OR (y.Client IS NULL)
    OR (y.Prod IS NULL)

あなたが必要

 (x.Client    = y.Client OR y.Client IS NULL)
AND
( x.Prod      = y.Prod  OR y.Prod IS NULL)

そして、それがオリジナルよりも優れているかどうかはわかりません。

パフォーマンスに関しては、SQL Server ではISNULLが よりも優れていることがよくありますCOALESCEが、それが重要な場合、後者は ANSI に準拠しています。

だから私には思えますが、あなたは左結合をしようとしているのかもしれませんか?

 FROM   dbo.tb_xxx x
 LEFT JOIN dbo.tb_yyy y ON       
    x.Client    = y.Client AND
    x.Prod      = y.Prod 
于 2013-08-16T13:04:45.777 に答える