복붙노트

[SQL] UNION ALL 대 OR 조건 SQL 서버 쿼리

SQL

UNION 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. ==============================

    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. ==============================

    2.문제는 당신이 당신의 쿼리에서 별도의 테이블에 적용 또는 두 개의 조건을 지정하는 것입니다. 이 때문에, 클러스터되지 않은 인덱스가 추구 그들은 또한 두 번째 테이블에서 조건 절과 일치 할 수 있습니다 또는 논리 수단 때문에 큰 테이블의 행의 대부분 또는 전부를 반환해야합니다.

    문제는 당신이 당신의 쿼리에서 별도의 테이블에 적용 또는 두 개의 조건을 지정하는 것입니다. 이 때문에, 클러스터되지 않은 인덱스가 추구 그들은 또한 두 번째 테이블에서 조건 절과 일치 할 수 있습니다 또는 논리 수단 때문에 큰 테이블의 행의 대부분 또는 전부를 반환해야합니다.

    는 SQL 실행 위의 세 가지 예에서 계획, 통지 클러스터되지 않은 인덱스 나올 행의 수를 봐 큰 테이블에서 찾는다. 궁극적 인 결과는 해당 테이블의 내용 그들이 마지막에 필요한 될 수 있기 때문에 OR 수단 두 번째 테이블의 조건과 교차 참조 할 필요가 있다는 800,000 테이블의 행하지만 OR 절 수단의 1,000 이하를 반환 할 수 있습니다 쿼리 출력.

    당신의 실행 계획에 따라 인덱스 그들은 또한 두 번째 테이블의 OR 조항의 조건과 일치 할 수 있기 때문에 큰 테이블의 모든 80 개 행을 당겨 수 있습니다 추구합니다. 인덱스는 출력에 해당 쿼리에 대한 조건과 일치 할 수 있습니다 작은 결과 세트가 추구하므로 UNION ALL은 한 테이블 각각에 대한 두 개의 별도의 쿼리입니다.

    나는이 말이 바랍니다. 실행 속도가 느린 SQL 문을 리팩토링하는 동안 같은 상황에 걸쳐 실행했습니다.

    건배,

    다른 라니에리

  3. ==============================

    3.더 이상 두 번째 쿼리에 인덱스를 사용하지하는 OR의 사용은 아마도 쿼리 최적화를 일으키는 것입니다. 상기 봐 각 쿼리에 대해 설명하고 그게 당신에게 답을 알려드립니다.

    더 이상 두 번째 쿼리에 인덱스를 사용하지하는 OR의 사용은 아마도 쿼리 최적화를 일으키는 것입니다. 상기 봐 각 쿼리에 대해 설명하고 그게 당신에게 답을 알려드립니다.

  4. from https://stackoverflow.com/questions/5639710/union-all-vs-or-condition-in-sql-server-query by cc-by-sa and MIT license