2010-12-06 5 views
4

MS SQL을 사용하고 있습니다.INTERSECT가 중첩 된 JOIN만큼 느린 이유는 무엇입니까?

select userid from IncrementalStatistics where 
IncrementalStatisticsTypeID = 5 and 
IncrementalStatistics.AssociatedPlaceID = 47828 and 
IncrementalStatistics.Created > '12/2/2010 

그것은 1 초 미만에 반환

나는 지수와 큰 테이블이 빨리이 쿼리를해야한다. 표에는 수십억 개의 행이 있습니다. 단지 약 10000 개의 결과가 있습니다.

select userid from IncrementalStatistics where 
IncrementalStatisticsTypeID = 5 and 
IncrementalStatistics.AssociatedPlaceID = 47828 and 
IncrementalStatistics.Created > '12/2/2010' 

intersect 

select userid from IncrementalStatistics where 
IncrementalStatisticsTypeID = 5 and 
IncrementalStatistics.AssociatedPlaceID = 40652 and 
IncrementalStatistics.Created > '12/2/2010' 

intersect 

select userid from IncrementalStatistics where 
IncrementalStatisticsTypeID = 5 and 
IncrementalStatistics.AssociatedPlaceID = 14403 and 
IncrementalStatistics.Created > '12/2/2010' 

을하지만 20초를 취합니다

나는이 쿼리는 두 번째에 대해에 완료 할 것으로 예상한다. 모든 개별 쿼리는 < 1 초가 걸리고 약 10,000 개의 결과가 반환됩니다.

나는 내부적으로 SQL을 사용하여 각 하위 쿼리의 결과를 해시 테이블에 던져서 해시 교차를 수행해야하며 O (n)이어야한다고 예상합니다. 결과 세트는 메모리에 맞게 충분히 크므로 IO 문제는 아닌지 의심 스럽습니다.

나는 일련의 중첩 된 JOIN 인 대체 쿼리를 작성했으며이 작업에도 약 20 초가 소요됩니다.

왜 INTERSECT가 느린가요? 쿼리 처리의 초기 단계에서 JOIN으로 축소됩니까?

+1

"나는 그것이 io 문제 일까 의심됩니다."- 무엇이 설명 계획에서 가장 비싼 부분이 쿼리라고 말합니까? – Donnie

+0

MS SQL에 EXPLAIN 또는 쿼리 계획을 볼 수있는 방법이 있습니까? 다른 사람들의 답변을 기반으로, INTERSECT 구현과 같은 소리는 똑똑하지 않습니다. –

+0

@Brendan - 쿼리 계획에 대한 멋진 시각화가 있습니다. 이 쿼리는 그럴 필요가있을 정도로 미묘한 것 같지 않았습니다. 직관적 인 주장을 찾고있었습니다. –

답변

14

대신 사용해보십시오. 분명히 밝혀지지는 않았지만 원하는 결과를 얻을 것이라고 생각합니다.

select userid 
    from IncrementalStatistics 
    where IncrementalStatisticsTypeID = 5 
     and IncrementalStatistics.AssociatedPlaceID in (47828,40652,14403) 
     and IncrementalStatistics.Created > '12/2/2010' 
    group by userid 
    having count(distinct IncrementalStatistics.AssociatedPlaceID) = 3 
+0

야! 그것은 1 톤 더 빨랐다. 이유를 알고 싶습니다. 실제로는 후드 아래에있는 것보다 * 더 많은 일을하고있는 것 같습니다. –

+1

@ John Shedletsky : IncrementalStatistics 테이블에서 단일 패스를 사용하는 경우와 3 개의 완전히 다른 쿼리를 비교하는 경우가 더 빠릅니다. –

+1

@ Joe : 그게 훨씬 빠르다는 의혹 이네. INTERSECTing 10000 개의 메모리 스트링 중 두 세트는 모든 PC에서 1 초 미만으로 소요되므로 John의 쿼리가 3 * 1 + 1 + 1 = 5s보다 오래 걸릴 수있는 유일한 이유는 DB 엔진이 자신의 원래 검색어. –

관련 문제