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
쿼리 계획을 보면 이유를 찾기가 어렵지 않습니다.
SQL Server 는 해시 매치 전에 두 종류의 9 백만 행 을 배치하지만 해시 매치 후에 는 70.000 개의 행만 추가하는 것이 좋습니다.
질문 : 쿼리 옵티 마이저에게 어떻게 지시 할 수 있습니까?
EXCEPT
(예 :)에 대한 대안을 사용해 보셨습니까 OUTER JOIN
? 구문이 덜 편리하다는 것을 알고 있지만 색인 / 조인 힌트로 더 잘 재생할 수 있습니다 (또는 필요하지 않을 수도 있음). 지금 사용하는 대안 (먼저 #temp 테이블에 포함)이 최후의 해결 방법이지만 경우에 따라 옵티마이 저가 원하는 방식으로 쿼리의 두 부분을 완전히 분리하도록하는 유일한 방법입니다.