私はかなり定期的にISNULL
and COALESCE
inON
句を使用していますが、インデックスが使用されない可能性があるため、最適化の問題が発生する可能性があることを読みました。
私は現在、次のものを持っています:
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)