최적화하려는 중간 정도의 복잡한 쿼리의 경우 TOP n
절 을 제거 하면 실행 계획이 변경됩니다. 쿼리 TOP n
에 데이터베이스 엔진이 포함 되면 TOP
절을 무시하고 쿼리를 실행 한 다음 결국에는 결과 집합 을 요청 된 n 개의 행 수로 줄입니다. 그래픽 실행 계획은 이것이 사실임을 나타내는 것 같습니다 – TOP
"마지막"단계입니다. 그러나 더 진행되고있는 것으로 보입니다.
내 질문은 TOP n 절이 쿼리 실행 계획에 어떻게 (그리고 왜) 영향을 미칩니 까?
다음은 제 경우에 진행되고있는 것의 단순화 된 버전입니다.
쿼리가 A와 B라는 두 테이블의 행과 일치합니다.
TOP
절이 없으면 옵티마이 저는 테이블 A에서 19k 개의 행과 테이블 B에서 46k 개의 행이있을 것으로 추정합니다. 리턴 된 실제 행 수는 A의 경우 16k이고 B의 경우 13k입니다. 해시 일치는이 두 결과 세트를 결합하는 데 사용됩니다. 총 69 개의 행 (정렬이 적용됨). 이 쿼리는 매우 빠르게 발생합니다.
내가 TOP 1001
최적화를 추가 하면 해시 일치를 사용하지 않습니다. 대신 먼저 테이블 A (동일한 추정 / 실제 19k / 16k)의 결과를 정렬하고 테이블 B에 대해 중첩 루프를 수행합니다. 테이블 B의 예상 행 수는 이제 1이며 이상한 점은 테이블에 TOP n
직접 영향을 미친다는 것입니다. B에 대한 예상 실행 수 (인덱스 탐색) – 항상 2n + 1 또는 내 경우에는 2003으로 나타납니다 .이 추정값은 변경하면 그에 따라 변경 TOP n
됩니다. 물론 이것은 중첩 조인이므로 실제 실행 수는 16k (테이블 A의 행 수)이며 쿼리 속도가 느려집니다.
실제 시나리오는 좀 더 복잡하지만 기본 아이디어 / 동작을 캡처합니다. 인덱스 탐색을 사용하여 두 테이블을 모두 검색합니다. 이것은 SQL Server 2008 R2 Enterprise 버전입니다.
FAST num_rows
쿼리 힌트
ORDER BY
절이 있습니다.TOP
계획 에서이 정렬이 발생하는 위치에 변경 사항을 추가 하지만 테이블 B에 대한 인덱스 검색 실행 횟수에 어떤 영향을 미치는지에 대해 더 관심이 있습니다 ... (물론 두 가지는 관련이 있습니다-알 수 없음)