এটি এসকিউএল সার্ভারে একটি বাগ (২০০৮ থেকে ২০১৪ পর্যন্ত অন্তর্ভুক্ত)।
আমার বাগ রিপোর্ট এখানে ।
ফিল্টারিং শর্তটি স্ক্যান অপারেটরে একটি অবশিষ্টাংশ হিসাবে বিবেচিত হয়, তবে বাছাইয়ের জন্য মেমরিটি ভুলভাবে গণনা করা হয় ফিল্টার প্রাক কার্ডিনালিটির প্রাক্কলনের ভিত্তিতে ।
ইস্যুটি চিত্রিত করার জন্য, ফিল্টারটিকে স্ক্যান অপারেটরটিতে নামানো থেকে রোধ করতে আমরা (অননুমোদিত এবং অসমর্থিত) ট্রেস পতাকা 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);
এই সূচিটি স্থিতিতে , বাছাইয়ের জন্য পছন্দসই মেমরি অনুদানটি কেবল 928 কেবি :
আরও এগিয়ে গেলে, নিম্নলিখিত সূচকটি সম্পূর্ণরূপে বাছাই করতে পারে ( শূন্য মেমরি অনুদান):
-- Provides filtering and sort order
-- nvarchar(max) column deliberately not INCLUDEd
CREATE NONCLUSTERED INDEX IX_dbo_Test_FilterMe_SortMe
ON dbo.Test (FilterMe, SortMe);
এসকিউএল সার্ভার x64 বিকাশকারী সংস্করণের নিম্নলিখিত বিল্ডগুলিতে পরীক্ষিত এবং বাগটি নিশ্চিত হয়েছে:
2014 : 12.00.2430 (RTM CU4)
2012 : 11.00.5556 (SP2 CU3)
2008R2 : 10.50.6000 (SP3)
2008 : 10.00.6000 (SP4)
ছিল ফিক্সড মধ্যে SQL সার্ভার 2016 সার্ভিস প্যাক 1 । প্রকাশের নোটগুলিতে নিম্নলিখিতগুলি অন্তর্ভুক্ত রয়েছে:
ভিএসটিএস বাগ নম্বর 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
সিই মডেল উভয়ই।