অনুপস্থিত সূচক অনুরোধগুলিতে কীভাবে এসকিউএল সার্ভার কী কলামের আদেশ নির্ধারণ করে?


উত্তর:


44

যখন এসকিউএল সার্ভার কোনও নির্দিষ্ট ক্যোয়ারী পরিকল্পনার জন্য অনুপস্থিত সূচকের প্রস্তাব তৈরি করে, তখন এটি সম্ভাব্য কী কলামগুলি 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

সমস্ত তিনটি টেবিলের হুবহু একই ডেটা রয়েছে এবং অনুসন্ধানগুলি অভিন্ন। পার্থক্যটি কেবল ক্ষেত্রের ক্রম - এবং এটি আমাদের অনুপস্থিত সূচী অনুরোধগুলির মধ্যেও পার্থক্য:

3 সমতা ক্ষেত্রের সাথে সম্পাদনের পরিকল্পনা রয়েছে

এক্সিকিউশন প্ল্যানগুলিতে, অনুপস্থিত সূচী অনুরোধের কলাম ক্রমটি সারণীতে কলামের ক্রমের সাথে ঠিক মেলে। উদাহরণস্বরূপ, dbo.NumberLetterDate এ, নম্বর কলামটি প্রথম, তাই অনুপস্থিত সূচী অনুরোধে এটিও প্রথম:

  • Dbo.NumberLetterDate- এ, অনুপস্থিত সূচকটি FINT (সংখ্যা), fLetter (nvachar), fDate, টেবিলের ক্ষেত্রগুলির একই ক্রম
  • Dbo.LetterDateNumber এ, সূচী আদেশটি fNVARCHAR, আপডেট, ফিন্টে স্যুইচ করে
  • Dbo.DateNumberLetter এ, সূচী আদেশটি FDATE, FINT, fNVARCHAR এ স্যুইচ করে

এর মতো একক টেবিল ক্রিয়াকলাপের জন্য, সূচী ক্ষেত্রের ক্রমটি নির্বাচিততা, ডেটাটাইপ বা কোয়েরিতে অবস্থানের উপর নির্ভর করে না। (আমি আরও জটিল প্রশ্নগুলির সাথে এটি প্রমাণ করার জন্য এটি অন্যান্য লোকদের কাছে রেখে দিয়েছি)

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 টি অনুপস্থিত অনুরোধে শেষ দেখাবে কারণ এটি একটি অসমতার অনুসন্ধান:

কার্যকরকরণ 2 টি সমতা এবং 1 অসমতার অনুসন্ধানের পরিকল্পনা করে

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 ক্ষেত্রের অনুপস্থিত সূচকের সুপারিশে একই অগ্রাধিকার ক্রম রয়েছে এবং এখন আমরা মাঠের ক্রম অনুসারে খাঁটি বাছাইতে ফিরে এসেছি:

3 অসমতার অনুসন্ধানের সাথে মৃত্যুদণ্ড কার্যকর করার পরিকল্পনা রয়েছে

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.