엄청나게 느린 쿼리의 속도를 높이기 위해 ( 중요한 경우 SQL Server 2008에서 각각 최대 50,000 개의 행이있는 두 테이블에서 몇 분 ) 문제를 다음 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
.. 이제 쿼리가 약 1 초 안에 실행됩니다!
를 OR
조인 조건에 두는 것이 일반적으로 나쁜 생각 입니까? 아니면 내 테이블 레이아웃이 어떻게 든 운이 좋지 않습니까?
답변
이러한 종류 JOIN
는 HASH JOIN
또는 MERGE JOIN
.
두 결과 집합의 연결로 표현할 수 있습니다.
SELECT *
FROM maintable m
JOIN othertable o
ON o.parentId = m.id
UNION
SELECT *
FROM maintable m
JOIN othertable o
ON o.id = m.parentId
, 각각은 SQL Server
동등 조인이지만의 옵티마이 저는 작성한 쿼리에서 볼 수있을만큼 똑똑하지 않습니다 (논리적으로 동일하지만).
답변
나는 나를 위해 일한 조건과 다른 결과를 얻기 위해 다음 코드를 사용합니다.
Select A.column, B.column
FROM TABLE1 A
INNER JOIN
TABLE2 B
ON A.Id = (case when (your condition) then b.Id else (something) END)
답변
대신 UNION ALL을 사용할 수 있습니다.
SELECT mt.ID, mt.ParentID, ot.MasterID
FROM dbo.MainTable AS mt
Union ALL
SELECT mt.ID, mt.ParentID, ot.MasterID
FROM dbo.OtherTable AS ot