옵티마이 저의 동작을 더 잘 이해하고 인덱스 스풀 주위의 한계를 이해하기 위해이 질문을하고 있습니다. 1에서 10000까지의 정수를 힙에 넣었다고 가정하십시오.
CREATE TABLE X_10000 (ID INT NOT NULL);
truncate table X_10000;
INSERT INTO X_10000 WITH (TABLOCK)
SELECT TOP 10000 ROW_NUMBER() OVER (ORDER BY (SELECT NULL))
FROM master..spt_values t1
CROSS JOIN master..spt_values t2;
그리고 중첩 루프 조인을 MAXDOP 1
다음 과 같이 수행하십시오.
SELECT *
FROM X_10000 a
INNER JOIN X_10000 b ON a.ID = b.ID
OPTION (LOOP JOIN, MAXDOP 1);
이는 SQL Server에 대해 다소 우호적 인 조치입니다. 중첩 루프 조인은 두 테이블에 모두 관련 인덱스가 없을 때 종종 좋은 선택이 아닙니다. 계획은 다음과 같습니다.
테이블 스풀에서 100000000 개의 행을 가져 와서 내 컴퓨터에서 쿼리를 수행하는 데 13 초가 걸립니다. 그러나 쿼리 속도가 느린 이유는 알 수 없습니다. 쿼리 최적화 프로그램은 인덱스 스풀을 통해 즉시 인덱스를 작성할 수 있습니다 . 이 쿼리는 인덱스 스풀의 완벽한 후보 인 것 같습니다.
다음 쿼리는 첫 번째 쿼리와 동일한 결과를 반환하고 인덱스 스풀을 가지며 1 초 이내에 완료됩니다.
SELECT *
FROM X_10000 a
CROSS APPLY (SELECT TOP (9223372036854775807) b.ID FROM X_10000 b WHERE a.ID = b.ID) ca
OPTION (LOOP JOIN, MAXDOP 1);
이 쿼리에는 인덱스 스풀도 있으며 1 초 이내에 완료됩니다.
SELECT *
FROM X_10000 a
INNER JOIN X_10000 b ON a.ID >= b.ID AND a.ID <= b.ID
OPTION (LOOP JOIN, MAXDOP 1);
원래 쿼리에 인덱스 스풀이없는 이유는 무엇입니까? 인덱스 스풀을 제공하는 문서화되거나 문서화되지 않은 힌트 또는 추적 플래그가 있습니까? 이 관련 질문을 찾았 지만 내 질문에 완전히 대답하지 못하여이 쿼리에 대해 신비한 추적 플래그를 사용할 수 없습니다.