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 ORin 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, OReine Join-Bedingung zu setzen? Oder habe ich einfach Pech beim Layout meiner Tische?