Намагаючись покращити швидкість надзвичайно повільного запиту (кілька хвилин на двох таблицях із лише ~ 50 000 рядків кожна, на SQL Server 2008, якщо це важливо), я звузив проблему до 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
.. і запит тепер виконується приблизно за секунду!
Це взагалі погана ідея ставити OR
приєднання? Або мені просто не пощастило якось у макеті моїх таблиць?