[SQL] 내부의 'OR'는 조건이 나쁜 생각 JOIN 데?
SQL내부의 'OR'는 조건이 나쁜 생각 JOIN 데?
대단히 느린 쿼리의 속도로, 내가 조인에 또는 나의 내부에 문제가 좁혀 (각각,이 중요한 경우 SQL 서버 2008 만 ~ 5 만 개 행이 개 테이블에 몇 분)을 개선하기 위해 노력에서 :
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
나는 (I가 무슨 희망) 왼쪽의 동등한 쌍, 여기에 표시 조인이 변경 :
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.가입 이런 종류의 해시 조인을 최적화 할 수 없거나 병합이 가입.
가입 이런 종류의 해시 조인을 최적화 할 수 없거나 병합이 가입.
이것은 두 가지 결과 집합의 연결로 표현 될 수있다 :
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 서버의 최적화는 당신이 쓴 쿼리에서 볼 수있는 스마트 충분이 아닌 (그들은 논리적으로 동일하지만).
-
==============================
2.상태에서 다른 결과를 얻기 위해 나는 코드를 다음을 사용 그건 나를 위해 일했다.
상태에서 다른 결과를 얻기 위해 나는 코드를 다음을 사용 그건 나를 위해 일했다.
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)
-
==============================
3.대신 UNION ALL을 사용할 수 있습니다.
대신 UNION ALL을 사용할 수 있습니다.
SELECT mt.ID, mt.ParentID, ot.MasterID dbo.MainTable AS 금강산 FROM 연합 ALL SELECT mt.ID, mt.ParentID, ot.MasterID dbo.OtherTable AS의 구약
from https://stackoverflow.com/questions/5901791/is-having-an-or-in-an-inner-join-condition-a-bad-idea by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] 날짜 범위 사이의 날짜를 생성 (0) | 2020.03.25 |
---|---|
[SQL] 차이를하는 SQL JOIN (0) | 2020.03.25 |
[SQL] MySQL은 두 날짜 사이의 차이 (0) | 2020.03.25 |
[SQL] 쉼표로 구분 한 값과 복수의 열 [중복] (0) | 2020.03.25 |
[SQL] SQLite는 테이블에서 삭제 열 (0) | 2020.03.25 |