यह SQL सर्वर में एक बग (2008 से 2014 तक समावेशी) है।
मेरी बग रिपोर्ट यहाँ है ।
फ़िल्टरिंग स्थिति को अवशिष्ट विधेय के रूप में स्कैन ऑपरेटर में नीचे धकेल दिया जाता है, लेकिन इस प्रकार के लिए दी गई मेमोरी को पूर्व-फ़िल्टर कार्डिनलिटी अनुमान के आधार पर गलत तरीके से गणना की जाती है ।
समस्या का वर्णन करने के लिए, हम फ़िल्टर को ऑपरेटर से नीचे धकेलने से रोकने के लिए (undocumented और असमर्थित) ट्रेस ध्वज 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!
एक उत्पादन प्रणाली के लिए , समस्याग्रस्त योजना के आकार (एक अन्य स्तंभ पर एक प्रकार के साथ एक स्कैन में धकेल दिया गया फिल्टर) से बचने के लिए कदम उठाने होंगे । ऐसा करने का एक तरीका फ़िल्टर स्थिति पर एक सूचकांक प्रदान करना और / या आवश्यक सॉर्ट क्रम प्रदान करना है।
-- 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 डेवलपर संस्करण के निम्न बिल्ड पर परीक्षण और बग की पुष्टि की गई है:
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 मॉडल।