আসুন কয়েক কলাম সহ দশ মিলিয়ন সারি একটি টেম্প টেবিলের মধ্যে ফেলে দিন:
CREATE TABLE #174860 (
PK INT NOT NULL,
COL1 INT NOT NULL,
COL2 INT NOT NULL,
PRIMARY KEY (PK)
);
INSERT INTO #174860 WITH (TABLOCK)
SELECT RN
, RN % 1000
, RN % 10000
FROM
(
SELECT TOP 1000000 ROW_NUMBER () OVER (ORDER BY (SELECT NULL)) RN
FROM master..spt_values v1,
master..spt_values v2
) t;
CREATE INDEX IX_174860_IX ON #174860 (COL1) INCLUDE (COL2);
এখানে আমার PK
কলামে একটি ক্লাস্টার ইনডেক্স আছে (ডিফল্টরূপে) । এটিতে COL1
একটি মূল বিবিধ তালিকা COL1
রয়েছে এবং এর অন্তর্ভুক্ত রয়েছে COL2
।
নিম্নলিখিত কোয়েরি বিবেচনা করুন:
SELECT *
FROM #174860
WHERE PK >= 15000 AND PK < 15005
AND COL2 = 5000;
এখানে আমি ব্যবহার করছি না BETWEEN
কারণ অ্যারন বারট্রান্ড এই প্রশ্নটি ঘিরে আছে।
কীভাবে এসকিউএল সার্ভার অপ্টিমাইজার হওয়া উচিত? ভাল, আমি জানি যে ফিল্টারটি PK
ফলাফলটি পাঁচটি সারিতে কমাবে। এসকিউএল সার্ভার টেবিলের সমস্ত মিলিয়ন সারিটি পড়ার পরিবর্তে এই পাঁচটি সারিটিতে ঝাঁপ দেওয়ার জন্য ক্লাস্টারড সূচকটি ব্যবহার করতে পারে। তবে ক্লাস্টারড ইনডেক্সে কেবল কলাম হিসাবে পিকে কলাম রয়েছে। একবারে সারিটি মেমোরিতে পড়লে আমাদের ফিল্টারটি চালু করতে হবে COL2
। এখানে, PK
একটি সন্ধানের শিকারী এবং COL2
একটি শিকারী।
এসকিউএল সার্ভারটি প্রিকিকেট ব্যবহার করে পাঁচটি সারি সন্ধান করে এবং আরও পাঁচটি সারিটি সাধারণ প্রিকেটের সাহায্যে এক সারিতে হ্রাস করে।
যদি আমি ক্লাস্টারড সূচকটি আলাদাভাবে সংজ্ঞায়িত করি:
CREATE TABLE #174860 (
PK INT NOT NULL,
COL1 INT NOT NULL,
COL2 INT NOT NULL,
PRIMARY KEY (COL2, PK)
);
এবং একই ক্যোয়ারী চালান আমি বিভিন্ন ফলাফল পাই:
এই ক্ষেত্রে, এসকিউএল সার্ভার ধারাটিতে উভয় কলাম ব্যবহার করতে চাইতে পারে WHERE
। কী কলামগুলি ব্যবহার করে টেবিল থেকে হুবহু এক সারি পাঠ করা হয়।
আরও একটি উদাহরণের জন্য এই প্রশ্নটি বিবেচনা করুন:
SELECT *
FROM #174860
WHERE COL1 = 500
AND COL2 = 3545;
IX_174860_IX সূচকটি একটি প্রচ্ছদ সূচক কারণ এটিতে ক্যোয়ারির জন্য প্রয়োজনীয় সমস্ত কলাম রয়েছে। তবে, শুধুমাত্র COL1
একটি মূল কলাম। এসকিউএল সার্ভার সেই মানকটির সাথে 1000 টি সারি খুঁজে পেতে সেই কলামটির সাহায্য নিতে পারে COL1
। COL2
চূড়ান্ত ফলাফলটি 0 টি সারিতে সেট করতে হ্রাস করতে এটি কলামের সেই সারিগুলিকে আরও ফিল্টার করতে পারে।