이것은 SQL Server 의 버그 입니다 (2008 년부터 2014 년까지).
내 버그 리포트는 여기에 있습니다 .
필터링 조건이 잔존 술어로 스캔 연산자로 푸시 다운되지만 정렬에 부여 된 메모리는 사전 필터 카디널리티 추정치 에 따라 잘못 계산 됩니다 .
이 문제를 설명하기 위해 (문서화되지 않은 및 지원되지 않는) 추적 플래그 9130을 사용하여 필터 가 검색 연산자 로 푸시 다운 되는 것을 방지 할 수 있습니다. 정렬에 부여 된 메모리는 이제 스캔이 아니라 필터 출력의 예상 카디널리티를 기반으로 올바르게 설정됩니다.
SELECT
T.TID,
T.FilterMe,
T.SortMe,
T.Unused
FROM dbo.Test AS T
WHERE
T.FilterMe = 567
ORDER BY
T.SortMe
OPTION (QUERYTRACEON 9130); -- Not for production systems!
A의 생산 시스템 , 단계가주의해야 할 필요가 방지 문제가 평면 형상 (다른 열 상에 정렬하여 주사로 가압 필터). 이를 수행하는 한 가지 방법은 필터 조건에 대한 색인을 제공하거나 필요한 정렬 순서를 제공하는 것입니다.
-- Index on the filter condition only
CREATE NONCLUSTERED INDEX IX_dbo_Test_FilterMe
ON dbo.Test (FilterMe);
이 인덱스가 있으면 정렬에 필요한 메모리 부여는 928KB 에 불과합니다 .
더 나아가, 다음 인덱스는 일종의 완전히 (피할 수 제로 메모리 부여를)
-- Provides filtering and sort order
-- nvarchar(max) column deliberately not INCLUDEd
CREATE NONCLUSTERED INDEX IX_dbo_Test_FilterMe_SortMe
ON dbo.Test (FilterMe, SortMe);
다음 SQL Server x64 Developer Edition 빌드에서 테스트 및 버그 확인 :
2014 : 12.00.2430 (RTM CU4)
2012 : 11.00.5556 (SP2 CU3)
2008R2 : 10.50.6000 (SP3)
2008 : 10.00.6000 (SP4)
이것은 SQL Server 2016 서비스 팩 1 에서 수정 되었습니다 . 릴리스 정보는 다음과 같습니다.
VSTS 버그 번호 8024987
푸시 다운 술어가있는 테이블 스캔 및 인덱스 스캔은 상위 연산자에 대한 메모리 부여를 과대 평가하는 경향이 있습니다.
테스트 및 고정 확인 :
Microsoft SQL Server 2016 (SP1) - 13.0.4001.0 (X64) Developer Edition
Microsoft SQL Server 2014 (SP2-CU3) 12.0.5538.0 (X64) Developer Edition
두 CE 모델.