Al tratar de mejorar la velocidad de una consulta inmensamente lenta (varios minutos en dos tablas con solo ~ 50,000 filas cada una, en SQL Server 2008 si es importante), reduje el problema a una OR
combinación interna, como en:
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
Cambié esto a (lo que espero sea) un par equivalente de uniones izquierdas, que se muestran aquí:
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
.. y la consulta ahora se ejecuta en aproximadamente un segundo.
¿Es generalmente una mala idea poner un OR
en una condición de unión? ¿O simplemente tengo mala suerte en el diseño de mis tablas?