Bei dem Versuch, die Geschwindigkeit einer immens langsamen Abfrage zu verbessern (mehrere Minuten in zwei Tabellen mit jeweils nur ~ 50.000 Zeilen, wenn es darauf ankommt, unter SQL Server 2008), habe ich das Problem auf einen OR
in meinem inneren Join eingegrenzt, wie in:
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
Ich habe dies in ein äquivalentes Paar linker Verknüpfungen geändert (was ich hoffe), das hier gezeigt wird:
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
.. und die Abfrage läuft jetzt in ca. einer Sekunde!
Ist es im Allgemeinen eine schlechte Idee, OR
eine Join-Bedingung zu setzen? Oder habe ich einfach Pech beim Layout meiner Tische?