ORDER BY가 EXCEPT 이전 (느린) 이전과 이후 (빠른) 두 테이블을 정렬하는 이유는 무엇입니까?


12

SQL Server 2008 R2 쿼리 최적화 프로그램 퍼즐

우리는 두 개의 테이블을 가지고 있는데, 둘 다 9 백만 개의 행을 포함합니다. 70.000 개의 행이 다르고 다른 행은 동일합니다.

이것은 13 초 빠릅니다.

select * from bigtable1
except select * from similar_bigtable2

이것은 출력을 분류하며 13 초도 빠릅니다.

select * into #q from bigtable1
except select * from similar_bigtable2
select * from #q order by sort_column

이것은 매우 느리지 만 :

;with q as (
    select * from bigtable1
    except select * from similar_bigtable2
)
select * from q order by sort_column

그리고 때로는 SQL Server가 쿼리를 진행하기 전에 특정 부분을 미리 계산해야한다는 것을 암시하는 데 사용하는 "트릭"조차도 작동하지 않으며 쿼리 속도가 느려집니다.

;with q as (
    select top 100 percent * from bigtable1
    except select * from similar_bigtable2
)
select * from q order by sort_column

쿼리 계획을 보면 이유를 찾기가 어렵지 않습니다.

쿼리 계획 ORDER BY를 사용한 쿼리 계획

SQL Server 는 해시 매치 전에 두 종류의 9 백만 행 배치하지만 해시 매치 후에 는 70.000 개의 행만 추가하는 것이 좋습니다.

질문 : 쿼리 옵티 마이저에게 어떻게 지시 할 수 있습니까?


3
해시 매치 전에 정렬하지 않고 정렬 한 다음 병합 조인 (해시 조인이 아님)을 수행합니다. 어쩌면 해시 조인을 강제하거나 병합 조인을 방지하는 힌트가 있습니까?
Thilo

3
SQL Server 쿼리 최적화 프로그램 에서 데이터 정렬 이 유리한 것으로 판단 되어 훨씬 느린 Hash Match Join 또는 Nested Loop Join ... 대신 훨씬 빠른 병합 조인 (정렬 된 데이터에만 작동)을 사용할 수 있다고 판단한 것 같습니다 .
marc_s

9
EXCEPT(예 :)에 대한 대안을 사용해 보셨습니까 OUTER JOIN? 구문이 덜 편리하다는 것을 알고 있지만 색인 / 조인 힌트로 더 잘 재생할 수 있습니다 (또는 필요하지 않을 수도 있음). 지금 사용하는 대안 (먼저 #temp 테이블에 포함)이 최후의 해결 방법이지만 경우에 따라 옵티마이 저가 원하는 방식으로 쿼리의 두 부분을 완전히 분리하도록하는 유일한 방법입니다.
Aaron Bertrand

답변:


1

이 두 쿼리 계획의 주요 차이점은 실제로 해시 일치와 병합 조인의 차이점입니다. 해시 일치가보다 효율적이며 옵션 1 (CTE를 사용하지 않음)에서 쿼리가 더 빨리 실행되는 것을 볼 수 있습니다.

CTE는 훌륭한 도구이지만 복잡한 술어 또는 고유하지 않은 부모 / 자식 키의 두 가지 경우에 비효율적 인 것 같습니다. 귀하의 경우 고유 키가 없으며 SQL Server는 요구 사항을 충족시키기 위해 데이터 세트를 먼저 정렬해야합니다. 이 문제에 대해 자세히 알려면 아래 링크를 살펴보십시오. http://blogs.msdn.com/b/sqlcat/archive/2011/04/28/optimize-recursive-cte-query.aspx

따라서 속도를 느리게 수락하거나 WHILE 루프로 논리를 다시 작성해야합니다. 더 효율적입니다.


0

더 잘 해봐?

select * from
(
    select * from bigtable1
    except 
    select * from similar_bigtable2
) t
order by sort_column

0

이것은 이상적인 솔루션은 아니지만 효율적인 계획을 생성하기 위해 tsql을 구성 할 수없는 경우 원하는 계획을 시행하도록 계획 지침을 설정할 수 있습니다. 이렇게하면보다 효율적인 계획을 사용할 수있게되면 SQL을 고려하지 않지만 옵션입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.