Ao tentar melhorar a velocidade de uma consulta extremamente lenta (vários minutos em duas tabelas com apenas ~ 50.000 linhas cada, no SQL Server 2008 se for importante), reduzi o problema a um OR
em minha junção interna, como em:
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
Mudei isso para (o que espero que seja) um par equivalente de junções à esquerda, mostrado aqui:
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
.. e a consulta agora é executada em cerca de um segundo!
Geralmente é uma má ideia colocar um OR
em uma condição de junção? Ou estou apenas com azar de alguma forma no layout das minhas mesas?