এটি সামান্য বিস্তৃত তবে আমি মনে করি আমি সত্য প্রশ্নটি বুঝতে পেরেছি এবং সে অনুযায়ী উত্তর দেব। যদিও সারণী বনাম সূচি স্পুল সম্পর্কে কথা বলতে যাচ্ছি। আমি টেবিল এবং সূচি স্পলের মধ্যে একটি পছন্দ হিসাবে সেখানে দেখার পক্ষে এটি বেশ সঠিক বলে মনে করি না। আপনি কি জানেন যে, একটি সূক্ষ্ম সাবট্রিতে একটি সূচি স্পুল, একটি টেবিল স্পুল, বা উভয় সূচক স্পুল এবং একটি টেবিল স্পুল পাওয়া সম্ভব। আমি বিশ্বাস করি যে আপনি নিম্নলিখিত শর্তের অধীনে একটি সূচক স্পুল পেয়েছেন তা সাধারণভাবে বলা সঠিক:
- ক্যোয়ারী অপ্টিমাইজারটির একটি যোগদানকে একটি প্রয়োগে রূপান্তরিত করার কারণ রয়েছে
- ক্যোয়ারী অপ্টিমাইজার আসলে প্রয়োগে রূপান্তর সম্পাদন করে
- ক্যোয়ারী অপ্টিমাইজারটি সূচক স্পুল যুক্ত করতে নিয়মটি ব্যবহার করে (কমপক্ষে সূচি স্পলটি অবশ্যই নিরাপদ থাকতে হবে)
- সূচক স্পুল সহ পরিকল্পনাটি নির্বাচিত হয়
আপনি এগুলির বেশিরভাগটি সাধারণ ডেমো দিয়ে দেখতে পারেন। একজোড়া স্তূপ তৈরি করে শুরু করুন:
DROP TABLE IF EXISTS dbo.X_10000_VARCHAR_901;
CREATE TABLE dbo.X_10000_VARCHAR_901 (ID VARCHAR(901) NOT NULL);
INSERT INTO dbo.X_10000_VARCHAR_901 WITH (TABLOCK)
SELECT TOP (10000) ROW_NUMBER() OVER (ORDER BY (SELECT NULL))
FROM master..spt_values t1
CROSS JOIN master..spt_values t2;
DROP TABLE IF EXISTS dbo.X_10000_VARCHAR_800;
CREATE TABLE dbo.X_10000_VARCHAR_800 (ID VARCHAR(800) NOT NULL);
INSERT INTO dbo.X_10000_VARCHAR_800 WITH (TABLOCK)
SELECT TOP (10000) ROW_NUMBER() OVER (ORDER BY (SELECT NULL))
FROM master..spt_values t1
CROSS JOIN master..spt_values t2;
প্রথম ক্যোয়ারির জন্য, খোঁজ করার মতো কিছুই নেই:
SELECT *
FROM dbo.X_10000_VARCHAR_901 a
CROSS JOIN dbo.X_10000_VARCHAR_901 b
OPTION (MAXDOP 1);
সুতরাং জোড়টিকে প্রয়োগকে রূপান্তরিত করার জন্য অপ্টিমাইজারের কোনও কারণ নেই। ব্যয়বহুল কারণে আপনি একটি টেবিল স্পুল দিয়ে শেষ করেছেন। সুতরাং এই ক্যোয়ারী প্রথম পরীক্ষায় ব্যর্থ।
পরবর্তী ক্যোয়ারির জন্য, এটি আশা করা ন্যায়সঙ্গত যে অপটিমাইজারের কোনও প্রয়োগ বিবেচনা করার কারণ রয়েছে:
SELECT *
FROM dbo.X_10000_VARCHAR_901 a
INNER JOIN dbo.X_10000_VARCHAR_901 b ON a.ID = b.ID
OPTION (LOOP JOIN, MAXDOP 1);
তবে এটি বোঝানোর অর্থ নয়:
এই ক্যোয়ারী দ্বিতীয় পরীক্ষায় ব্যর্থ। একটি সম্পূর্ণ ব্যাখ্যা এখানে । সর্বাধিক প্রাসঙ্গিক অংশ উদ্ধৃত:
অপ্টিমাইজার কোনও প্রয়োগ সক্ষম করতে ফ্লাইতে একটি সূচক তৈরির বিষয়টি বিবেচনা করে না; বরং ইভেন্টের ক্রমটি সাধারণত বিপরীত হয়: পরিবর্তনে রূপান্তর করুন কারণ একটি ভাল সূচক বিদ্যমান।
অপ্টিমাইজার একটি প্রয়োগ বিবেচনা করতে উত্সাহিত করতে আমি ক্যোয়ারীটি পুনরায় লিখতে পারি:
SELECT *
FROM dbo.X_10000_VARCHAR_901 a
INNER JOIN dbo.X_10000_VARCHAR_901 b ON a.ID >= b.ID AND a.ID <= b.ID
OPTION (MAXDOP 1);
তবে এখনও কোনও সূচকের স্পুল নেই:
এই ক্যোয়ারী তৃতীয় পরীক্ষায় ব্যর্থ। এসকিউএল সার্ভারে 2014 ইনডেক্স কী দৈর্ঘ্যের 900 বাইট ছিল। এটি এসকিউএল সার্ভার ২০১ extended সালে বাড়ানো হয়েছিল তবে কেবল অবিচ্ছিন্ন সূচকের জন্য। একটি স্পুলের সূচকটি একটি ক্লাস্টার্ড সূচক তাই সীমাটি 900 বাইটে থেকে যায় । যাই হোক না কেন, সূচী স্পুল নিয়ম প্রয়োগ করা যাবে না কারণ এটি ক্যোয়ারী কার্যকর করার সময় একটি ত্রুটি হতে পারে।
ডেটা ধরণের দৈর্ঘ্য 800 এ হ্রাস করা অবশেষে একটি সূচক স্পুল সহ একটি পরিকল্পনা সরবরাহ করে:
সূচক স্পুল পরিকল্পনাটি অবাক হওয়ার মতো নয়, কোনও স্পুল নেই এমন পরিকল্পনার তুলনায় উল্লেখযোগ্যভাবে সস্তা। আপনি অননুমোদিত QUERYRULEOFF BuildSpool
জিজ্ঞাসা ইঙ্গিতটির সাথে পার্থক্যটি দেখতে পাবেন :
এটি একটি সম্পূর্ণ উত্তর নয়, তবে আশা করি এটি আপনি যা খুঁজছিলেন তার মধ্যে কিছু এটি।