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으로 축소됩니까?
"나는 그것이 io 문제 일까 의심됩니다."- 무엇이 설명 계획에서 가장 비싼 부분이 쿼리라고 말합니까? – Donnie
MS SQL에 EXPLAIN 또는 쿼리 계획을 볼 수있는 방법이 있습니까? 다른 사람들의 답변을 기반으로, INTERSECT 구현과 같은 소리는 똑똑하지 않습니다. –
@Brendan - 쿼리 계획에 대한 멋진 시각화가 있습니다. 이 쿼리는 그럴 필요가있을 정도로 미묘한 것 같지 않았습니다. 직관적 인 주장을 찾고있었습니다. –