Jest to błąd w SQL Server (od 2008 do 2014 włącznie).
Mój raport o błędach jest tutaj .
Warunek filtrowania jest przekazywany do operatora skanowania jako predykat resztkowy, ale pamięć przyznana dla sortowania jest błędnie obliczana na podstawie oszacowania liczności filtra wstępnego .
Aby zilustrować problem, możemy użyć (nieudokumentowanej i nieobsługiwanej) flagi śledzenia 9130, aby zapobiec zepchnięciu filtra do operatora skanowania . Pamięć przyznana sortowaniu jest teraz poprawnie oparta na szacunkowej liczności danych wyjściowych filtra, a nie na skanie:
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!
W przypadku systemu produkcyjnego należy podjąć kroki, aby uniknąć problematycznego kształtu planu (filtr wypchnięty do skanu za pomocą sortowania w innej kolumnie). Jednym ze sposobów jest zapewnienie indeksu stanu filtru i / lub zapewnienie wymaganej kolejności sortowania.
-- Index on the filter condition only
CREATE NONCLUSTERED INDEX IX_dbo_Test_FilterMe
ON dbo.Test (FilterMe);
Po wprowadzeniu tego indeksu pożądany przydział pamięci dla sortowania wynosi tylko 928 KB :
Idąc dalej, następujący indeks może całkowicie uniknąć sortowania ( zero przyznania pamięci):
-- Provides filtering and sort order
-- nvarchar(max) column deliberately not INCLUDEd
CREATE NONCLUSTERED INDEX IX_dbo_Test_FilterMe_SortMe
ON dbo.Test (FilterMe, SortMe);
Przetestowano i potwierdzono błąd w następujących wersjach programu 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)
Zostało to naprawione w dodatku Service Pack 1 dla programu SQL Server 2016 . Informacje o wersji obejmują:
Numer błędu VSTS 8024987
Skany tabel i skany indeksów z predykatem push down zwykle przeceniają przyznanie pamięci dla operatora nadrzędnego.
Testowane i potwierdzone na:
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
Oba modele CE.