অপ্টিমাইজারের আচরণটি আরও ভালভাবে বুঝতে এবং সূচি স্পলের চারপাশের সীমাগুলি বোঝার জন্য আমি এই প্রশ্নটি করছি। মনে করুন যে আমি এক থেকে 10000 পর্যন্ত পূর্ণসংখ্যা স্থাপন করেছি:
CREATE TABLE X_10000 (ID INT NOT NULL);
truncate table X_10000;
INSERT INTO X_10000 WITH (TABLOCK)
SELECT TOP 10000 ROW_NUMBER() OVER (ORDER BY (SELECT NULL))
FROM master..spt_values t1
CROSS JOIN master..spt_values t2;
এবং একটি নেস্টেড লুপটি এর সাথে যোগ দিতে বাধ্য করুন MAXDOP 1
:
SELECT *
FROM X_10000 a
INNER JOIN X_10000 b ON a.ID = b.ID
OPTION (LOOP JOIN, MAXDOP 1);
এটি এসকিউএল সার্ভারের দিকে নেওয়া একটি বরং বন্ধুত্বপূর্ণ ক্রিয়া। উভয় টেবিলের কোনও প্রাসঙ্গিক সূচী না থাকলে নেস্টেড লুপটি প্রায়শই ভাল যোগ হয় না। পরিকল্পনাটি এখানে:
টেবিল স্পুল থেকে 100000000 সারি নিয়ে ক্যোয়ারীটি আমার মেশিনে 13 সেকেন্ড সময় নেয়। যাইহোক, কোয়েরিটি কেন ধীর হতে হবে তা আমি দেখছি না। ক্যোয়ারী অপ্টিমাইজারের সূচি স্পলের মাধ্যমে ফ্লাইতে সূচি তৈরির ক্ষমতা রয়েছে । এই ক্যোয়ারীটি মনে হচ্ছে এটি কোনও সূচক স্পুলের জন্য নিখুঁত প্রার্থী হবে।
নিম্নলিখিত ক্যোয়ারী প্রথমটির মতো একই ফলাফল দেয়, একটি সূচক স্পুল রয়েছে এবং এক সেকেন্ডেরও কম সময়ে শেষ হয়:
SELECT *
FROM X_10000 a
CROSS APPLY (SELECT TOP (9223372036854775807) b.ID FROM X_10000 b WHERE a.ID = b.ID) ca
OPTION (LOOP JOIN, MAXDOP 1);
এই ক্যোয়ারিতে একটি সূচক স্পুলও রয়েছে এবং এক সেকেন্ডেরও কম সময়ে শেষ হয়:
SELECT *
FROM X_10000 a
INNER JOIN X_10000 b ON a.ID >= b.ID AND a.ID <= b.ID
OPTION (LOOP JOIN, MAXDOP 1);
মূল ক্যোয়ারিতে সূচকের স্পুল নেই কেন? এমন কোনও দলিলযুক্ত বা অননুমোদিত ইঙ্গিত বা পতাকা চিহ্নিত করার কোনও সেট রয়েছে যা এটিকে একটি সূচক স্পুল দেবে? আমি এই সম্পর্কিত প্রশ্নটি পেয়েছি , তবে এটি আমার প্রশ্নের পুরোপুরি উত্তর দেয় না এবং আমি এই কোয়েরির জন্য রহস্যজনক ট্রেস পতাকা পেতে পারি না।