Является ли использование «ИЛИ» в условии INNER JOIN плохой идеей?

Пытаясь повысить скорость чрезвычайно медленного запроса (несколько минут для двух таблиц, содержащих всего ~ 50 000 строк в каждой, на SQL Server 2008, если это имеет значение), я сузил проблему до ИЛИ в моем внутреннем соединении, например:

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

.. и теперь запрос выполняется примерно за секунду!

Является ли вообще плохой идеей помещать ИЛИ в условие соединения? Или мне просто не повезло с макетом таблиц?

89
задан abatishchev 9 September 2012 в 11:33
поделиться