Próbując poprawić szybkość niezwykle powolnego zapytania (kilka minut na dwóch tabelach zawierających tylko ~ 50 000 wierszy w każdej, w SQL Server 2008, jeśli ma to znaczenie), zawęziłem problem do połączenia OR
wewnętrznego, na przykład:
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
Zmieniłem to na (mam nadzieję) równoważną parę lewych złączeń, pokazaną tutaj:
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
.. a zapytanie działa teraz za około sekundę!
Czy wprowadzenie OR
warunku złączenia jest ogólnie złym pomysłem ? A może po prostu mam pecha w układzie moich stołów?