Ini adalah bug di SQL Server (mulai 2008 hingga 2014).
Laporan bug saya ada di sini .
Kondisi penyaringan didorong ke bawah ke operator pemindaian sebagai predikat residual, tetapi memori yang diberikan untuk jenis ini keliru dihitung berdasarkan perkiraan kardinalitas pra-filter .
Untuk mengilustrasikan masalah ini, kita dapat menggunakan jejak bendera 9130 (tidak berdokumen dan tidak didukung) untuk mencegah Filter didorong ke operator pemindaian . Memori yang diberikan untuk pengurutan sekarang dengan benar didasarkan pada perkiraan kardinalitas keluaran Filter, bukan pemindaian:
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!
Untuk sistem produksi , langkah-langkah perlu diambil untuk menghindari bentuk rencana yang bermasalah (filter didorong ke pemindaian dengan pengurutan pada kolom lain). Salah satu cara untuk melakukan ini adalah dengan memberikan indeks pada kondisi filter dan / atau untuk memberikan urutan pengurutan yang diperlukan.
-- Index on the filter condition only
CREATE NONCLUSTERED INDEX IX_dbo_Test_FilterMe
ON dbo.Test (FilterMe);
Dengan indeks ini di tempat, hibah memori yang diinginkan untuk pengurutan hanya 928KB :
Lebih jauh, indeks berikut ini dapat menghindari penyortiran sepenuhnya ( zero memory grant):
-- Provides filtering and sort order
-- nvarchar(max) column deliberately not INCLUDEd
CREATE NONCLUSTERED INDEX IX_dbo_Test_FilterMe_SortMe
ON dbo.Test (FilterMe, SortMe);
Diuji dan bug dikonfirmasi pada build berikut dari SQL Server x64 Edisi Pengembang:
2014 : 12.00.2430 (RTM CU4)
2012 : 11.00.5556 (SP2 CU3)
2008R2 : 10.50.6000 (SP3)
2008 : 10.00.6000 (SP4)
Ini diperbaiki di SQL Server 2016 Paket Layanan 1 . Catatan rilis meliputi yang berikut ini:
Nomor bug VSTS 8024987
Pemindaian tabel dan pemindaian indeks dengan predikat push down cenderung melebih-lebihkan pemberian memori untuk operator induk.
Diuji dan dikonfirmasi tetap pada:
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
Kedua model CE.