এসকিউএল সার্ভার কীভাবে কোনও পরিকল্পনার জন্য অনুপস্থিত সূচী প্রস্তাবনায় কী কলামগুলির ক্রম নির্ধারণ করে?
এসকিউএল সার্ভার কীভাবে কোনও পরিকল্পনার জন্য অনুপস্থিত সূচী প্রস্তাবনায় কী কলামগুলির ক্রম নির্ধারণ করে?
উত্তর:
যখন এসকিউএল সার্ভার কোনও নির্দিষ্ট ক্যোয়ারী পরিকল্পনার জন্য অনুপস্থিত সূচকের প্রস্তাব তৈরি করে, তখন এটি সম্ভাব্য কী কলামগুলি 2 টি গ্রুপে পৃথক করে। প্রথম সেটটিতে সুপারিশকৃত সমস্ত কলাম রয়েছে যা একটি ইক্যুয়ালিটি প্রিডিকেটের অংশ। দ্বিতীয় সেটটিতে প্রস্তাবিত সমস্ত কলাম রয়েছে যা একটি অসম্পূর্ণতা পূর্বাভাসের অংশ contains
প্রতিটি সেট এর মধ্যে, কলামগুলি টেবিলের সংজ্ঞা অনুসারে কলামগুলির অর্ডিনাল অবস্থান অনুসারে অর্ডার করা হয়।
(এটি প্রমাণ করার জন্য স্ট্যাক ওভারফ্লো ডাটাবেসের বিরুদ্ধে রেপ্রো স্ক্রিপ্ট তৈরি করার জন্য ব্রেন্ট ওজারকে অনেক ধন্যবাদ!)
1. 3 টি অভিন্ন টেবিল তৈরি করুন , তবে তাদের কলামগুলি বিভিন্ন ক্রমে রাখুন। (এখানে কারণটি দেখানোর জন্য বিভিন্ন কলামের নাম এবং ডেটাটাইপ ব্যবহার করা যা এটি অনুপস্থিত সূচকের প্রস্তাবনায় কলামের ক্রমকে প্রভাবিত করে না))
CREATE TABLE dbo.NumberLetterDate (ID INT IDENTITY(1,1) PRIMARY KEY CLUSTERED,
fINT INT, fNVARCHAR NVARCHAR(40), fDATE DATETIME, AboutMe NVARCHAR(MAX));
GO
CREATE TABLE dbo.LetterDateNumber (ID INT IDENTITY(1,1) PRIMARY KEY CLUSTERED,
fNVARCHAR NVARCHAR(40), fDATE DATETIME, fINT INT, AboutMe NVARCHAR(MAX));
GO
CREATE TABLE dbo.DateNumberLetter (ID INT IDENTITY(1,1) PRIMARY KEY CLUSTERED,
fDATE DATETIME, fINT INT, fNVARCHAR NVARCHAR(40), AboutMe NVARCHAR(MAX));
GO
২. একই ডেটা সহ টেবিলগুলি বসান। রিয়েল-ওয়ার্ল্ড ডেটা বিতরণের মাধ্যমে ব্যবহারকারীদের সারণি থেকে 100,000 সারি পান।
INSERT INTO dbo.NumberLetterDate(fINT, fNVARCHAR, fDATE, AboutMe)
SELECT TOP 100000 Age, DisplayName, LastAccessDate, AboutMe
FROM dbo.Users WITH (NOLOCK)
ORDER BY Id;
GO
INSERT INTO dbo.LetterDateNumber(fINT, fNVARCHAR, fDATE, AboutMe)
SELECT TOP 100000 Age, DisplayName, LastAccessDate, AboutMe
FROM dbo.Users WITH (NOLOCK)
ORDER BY Id;
GO
INSERT INTO dbo.DateNumberLetter(fINT, fNVARCHAR, fDATE, AboutMe)
SELECT TOP 100000 Age, DisplayName, LastAccessDate, AboutMe
FROM dbo.Users WITH (NOLOCK)
ORDER BY Id;
GO
৩. এমন একটি ক্যোয়ারী লিখুন যাতে সূচকের প্রয়োজন হয়। 3 টি সমতা ফিল্টার দিয়ে শুরু করুন, সমস্ত 3 ক্ষেত্রে সঠিক মানের জন্য ফিল্টার করে। নোট করুন যে সমস্ত 3 টি প্রশ্নের একই ক্রমে একই ক্ষেত্র রয়েছে:
SELECT ID
FROM dbo.NumberLetterDate
WHERE fINT = 100
AND fNVARCHAR = 'Brent Ozar'
AND fDATE = '2018/01/01'
AND 1 = (SELECT 1);
SELECT ID
FROM dbo.LetterDateNumber
WHERE fINT = 100
AND fNVARCHAR = 'Brent Ozar'
AND fDATE = '2018/01/01'
AND 1 = (SELECT 1);
SELECT ID
FROM dbo.DateNumberLetter
WHERE fINT = 100
AND fNVARCHAR = 'Brent Ozar'
AND fDATE = '2018/01/01'
AND 1 = (SELECT 1);
GO
সমস্ত তিনটি টেবিলের হুবহু একই ডেটা রয়েছে এবং অনুসন্ধানগুলি অভিন্ন। পার্থক্যটি কেবল ক্ষেত্রের ক্রম - এবং এটি আমাদের অনুপস্থিত সূচী অনুরোধগুলির মধ্যেও পার্থক্য:
এক্সিকিউশন প্ল্যানগুলিতে, অনুপস্থিত সূচী অনুরোধের কলাম ক্রমটি সারণীতে কলামের ক্রমের সাথে ঠিক মেলে। উদাহরণস্বরূপ, dbo.NumberLetterDate এ, নম্বর কলামটি প্রথম, তাই অনুপস্থিত সূচী অনুরোধে এটিও প্রথম:
এর মতো একক টেবিল ক্রিয়াকলাপের জন্য, সূচী ক্ষেত্রের ক্রমটি নির্বাচিততা, ডেটাটাইপ বা কোয়েরিতে অবস্থানের উপর নির্ভর করে না। (আমি আরও জটিল প্রশ্নগুলির সাথে এটি প্রমাণ করার জন্য এটি অন্যান্য লোকদের কাছে রেখে দিয়েছি)
4. একটি অসমতা ফিল্টার মিশ্রিত করুন। INT ক্ষেত্রে, উদাহরণস্বরূপ, <> 100 টি ফিল্টার হিসাবে রাখুন:
SELECT ID
FROM dbo.NumberLetterDate
WHERE fINT <> 100
AND fNVARCHAR = 'Brent Ozar'
AND fDATE = '2018/01/01'
AND 1 = (SELECT 1);
SELECT ID
FROM dbo.LetterDateNumber
WHERE fINT <> 100
AND fNVARCHAR = 'Brent Ozar'
AND fDATE = '2018/01/01'
AND 1 = (SELECT 1);
SELECT ID
FROM dbo.DateNumberLetter
WHERE fINT <> 100
AND fNVARCHAR = 'Brent Ozar'
AND fDATE = '2018/01/01'
AND 1 = (SELECT 1);
GO
কার্যকর করার পরিকল্পনায় সমতা ক্ষেত্রগুলি প্রথমে যায়, তারপরে অসমতার ক্ষেত্রগুলি - সুতরাং এখানে, FINT সমস্ত 3 টি অনুপস্থিত অনুরোধে শেষ দেখাবে কারণ এটি একটি অসমতার অনুসন্ধান:
5. 3 অসমতার ফিল্টার ব্যবহার করুন। সমস্ত ক্ষেত্রের জন্য একই অনুসন্ধান ব্যবহার করুন (<>):
SELECT ID
FROM dbo.NumberLetterDate
WHERE fINT <> 100
AND fNVARCHAR <> 'Brent Ozar'
AND fDATE <> '2018/01/01'
AND 1 = (SELECT 1);
SELECT ID
FROM dbo.LetterDateNumber
WHERE fINT <> 100
AND fNVARCHAR <> 'Brent Ozar'
AND fDATE <> '2018/01/01'
AND 1 = (SELECT 1);
SELECT ID
FROM dbo.DateNumberLetter
WHERE fINT <> 100
AND fNVARCHAR <> 'Brent Ozar'
AND fDATE <> '2018/01/01'
AND 1 = (SELECT 1);
GO
যেহেতু কোনও সমতা অনুসন্ধান নেই, সমস্ত 3 ক্ষেত্রের অনুপস্থিত সূচকের সুপারিশে একই অগ্রাধিকার ক্রম রয়েছে এবং এখন আমরা মাঠের ক্রম অনুসারে খাঁটি বাছাইতে ফিরে এসেছি: