SQL Server 2008 (SP1) - 10.0.2531.0 (X64) - Win2008 SP2 (X64) で奇妙な状況に遭遇しました。
これは、1 つの重いクエリです。
select t1.id, t2.id
from t1, t2
where
t1.id = t2.ext_id
and isnull(t1.vchCol1, 'Null') = isnull(t2.vchCol1, 'Null')
and isnull(t1.vchCol2, 'Null') = isnull(t2.vchCol2, 'Null')
.... and about 10 more comparisons with Isnull
UPD : 比較対象のすべての列 (ID を除く) はvarchar
(~30...200)
T1 は ~130mln 行、T2 は ~300k 行です。
かなり大きな Dev サーバーでのこれらのクエリは、約 5 時間実行されます。これは遅いですが、何ができるでしょうか?
そして、最適化の可能な方法を調査したところ、上記のクエリで「isnull」を「coalesce」に変更すると、パフォーマンスが 2 倍になることがわかりました。クエリは現在、約 2 時間実行されています。
UPD : すべてのISNULL
チェックを削除しt1.vchCol1 = t2.vchCol1
てクエリのみを使用すると、40 分後に終了します。
質問: これは既知の動作であり、どこでもIsNullを使用しないようにする必要がありますか?