非常に遅いクエリの速度を改善しようとする際に(問題があった場合、SQL Server 2008では、それぞれ最大50,000行しかない2つのテーブルで数分)、問題を次のようOR
に内部結合のに絞り込みました。
SELECT mt.ID, mt.ParentID, ot.MasterID
FROM dbo.MainTable AS mt
INNER JOIN dbo.OtherTable AS ot ON ot.ParentID = mt.ID
OR ot.ID = mt.ParentID
これを(私が望んでいる)左結合の同等のペアに変更しました。次に例を示します。
SELECT mt.ID, mt.ParentID,
CASE WHEN ot1.MasterID IS NOT NULL THEN
ot1.MasterID ELSE
ot2.MasterID END AS MasterID
FROM dbo.MainTable AS mt
LEFT JOIN dbo.OtherTable AS ot1 ON ot1.ParentID = mt.ID
LEFT JOIN dbo.OtherTable AS ot2 ON ot2.ID = mt.ParentID
WHERE ot1.MasterID IS NOT NULL OR ot2.MasterID IS NOT NULL
..そして、クエリは約1秒で実行されます!
をOR
結合条件にすることは一般的に悪い考えですか?それとも、テーブルのレイアウトがどういうわけか不運なだけですか?