[SQL] UNION ALL 대 OR 조건 SQL 서버 쿼리
SQLUNION ALL 대 OR 조건 SQL 서버 쿼리
나는 테이블에없는 존재 조건에 따라 일부 행을 선택해야합니다. 나는 모든 아래와 같은 조합을 사용하는 경우는 1 초 미만으로 실행됩니다.
SELECT 1 FROM dummyTable
WHERE NOT EXISTS
(
SELECT 1 FROM TABLE t
WHERE Data1 = t.Col1 AND Data2=t.Col2
UNION ALL
SELECT 1 FROM TABLE t
WHERE Data1 = t.Col2 AND Data2=t.Col1
)
내가 OR 조건을 사용하는 경우, 그것은 테이블 게으른 풀을하고있는 SQL 서버로 분 가까이 소요됩니다. 누군가가 그것을 설명 할 수 있습니까?
SELECT 1 FROM dummyTable
WHERE NOT EXISTS
(
SELECT 1 FROM TABLE t
WHERE ( (Data1 = t.Col1 AND Data2=t.Col2) OR (Data1 = t.Col2 AND Data2=t.Col1))
)
해결법
-
==============================
1.쿼리 계획은 또한 테이블의 행 수에 의해 영향을 받는다. 테이블 t에 얼마나 많은 행이?
쿼리 계획은 또한 테이블의 행 수에 의해 영향을 받는다. 테이블 t에 얼마나 많은 행이?
당신은 또한 시도 할 수 있습니다 :
SELECT 1 FROM dummyTable WHERE NOT EXISTS ( SELECT 1 FROM TABLE t WHERE Data1 = t.Col1 AND Data2=t.Col2 ) AND NOT EXISTS ( SELECT 1 FROM TABLE t WHERE Data1 = t.Col2 AND Data2=t.Col1 )
또는 (SQL-Server에 대한 수정) 인덱스를 사용하는이 :
WITH tt AS <---- a temp table with 2 rows ( SELECT Data1 AS Col1, Data2 AS Col2 UNION SELECT Data2 AS Col1, Data1 AS Col2 ) SELECT 1 FROM dummyTable WHERE NOT EXISTS ( SELECT 1 FROM TABLE t JOIN tt ON tt.Col1 = t.Col1 AND tt.Col2=t.Col2 )
-
==============================
2.문제는 당신이 당신의 쿼리에서 별도의 테이블에 적용 또는 두 개의 조건을 지정하는 것입니다. 이 때문에, 클러스터되지 않은 인덱스가 추구 그들은 또한 두 번째 테이블에서 조건 절과 일치 할 수 있습니다 또는 논리 수단 때문에 큰 테이블의 행의 대부분 또는 전부를 반환해야합니다.
문제는 당신이 당신의 쿼리에서 별도의 테이블에 적용 또는 두 개의 조건을 지정하는 것입니다. 이 때문에, 클러스터되지 않은 인덱스가 추구 그들은 또한 두 번째 테이블에서 조건 절과 일치 할 수 있습니다 또는 논리 수단 때문에 큰 테이블의 행의 대부분 또는 전부를 반환해야합니다.
는 SQL 실행 위의 세 가지 예에서 계획, 통지 클러스터되지 않은 인덱스 나올 행의 수를 봐 큰 테이블에서 찾는다. 궁극적 인 결과는 해당 테이블의 내용 그들이 마지막에 필요한 될 수 있기 때문에 OR 수단 두 번째 테이블의 조건과 교차 참조 할 필요가 있다는 800,000 테이블의 행하지만 OR 절 수단의 1,000 이하를 반환 할 수 있습니다 쿼리 출력.
당신의 실행 계획에 따라 인덱스 그들은 또한 두 번째 테이블의 OR 조항의 조건과 일치 할 수 있기 때문에 큰 테이블의 모든 80 개 행을 당겨 수 있습니다 추구합니다. 인덱스는 출력에 해당 쿼리에 대한 조건과 일치 할 수 있습니다 작은 결과 세트가 추구하므로 UNION ALL은 한 테이블 각각에 대한 두 개의 별도의 쿼리입니다.
나는이 말이 바랍니다. 실행 속도가 느린 SQL 문을 리팩토링하는 동안 같은 상황에 걸쳐 실행했습니다.
건배,
다른 라니에리
-
==============================
3.더 이상 두 번째 쿼리에 인덱스를 사용하지하는 OR의 사용은 아마도 쿼리 최적화를 일으키는 것입니다. 상기 봐 각 쿼리에 대해 설명하고 그게 당신에게 답을 알려드립니다.
더 이상 두 번째 쿼리에 인덱스를 사용하지하는 OR의 사용은 아마도 쿼리 최적화를 일으키는 것입니다. 상기 봐 각 쿼리에 대해 설명하고 그게 당신에게 답을 알려드립니다.
from https://stackoverflow.com/questions/5639710/union-all-vs-or-condition-in-sql-server-query by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] 제거 및 날짜 범위를 중복 감소 (0) | 2020.05.24 |
---|---|
[SQL] 어떻게 반복의 MyBatis의 foreach에서의 HashMap을 통해? (0) | 2020.05.24 |
[SQL] 어떻게 sqlite가 테이블 안에 데이터가 있는지 확인할 수 있습니까? (0) | 2020.05.24 |
[SQL] SQL 뷰에 기본 키를 추가 (0) | 2020.05.24 |
[SQL] SQL을 사용하여 여러 분야에서 서로 다른 선택 (0) | 2020.05.24 |