수십 개의 행이있는 테이블이 있습니다. 단순화 된 설정은 다음과 같습니다
CREATE TABLE #data ([Id] int, [Status] int);
INSERT INTO #data
VALUES (100, 1), (101, 2), (102, 3), (103, 2);
그리고이 테이블을 일련의 테이블 값으로 구성된 행 (변수 및 상수로 구성)에 조인하는 쿼리가 있습니다.
DECLARE @id1 int = 101, @id2 int = 105;
SELECT
COALESCE(p.[Code], 'X') AS [Code],
COALESCE(d.[Status], 0) AS [Status]
FROM (VALUES
(@id1, 'A'),
(@id2, 'B')
) p([Id], [Code])
FULL JOIN #data d ON d.[Id] = p.[Id];
쿼리 실행 계획은 옵티마이 저의 결정이 FULL LOOP JOIN
전략 을 사용하는 것임을 보여줍니다. 두 입력 모두 행이 거의 없기 때문에 적절한 것으로 보입니다. 그러나 내가 알았고 동의 할 수없는 한 가지는 TVC 행이 스풀링되고 있다는 것입니다 (빨간색 상자의 실행 계획 영역 참조).
옵티마이 저가 스풀을 여기에 도입하는 이유는 무엇입니까? 스풀 외에는 복잡한 것이 없습니다. 필요하지 않은 것 같습니다. 이 경우 그것을 제거하는 방법, 가능한 방법은 무엇입니까?
위의 계획은
Microsoft SQL Server 2014 (SP2-CU11) (KB4077063)-12.0.5579.0 (X64)