এই উত্তর অনুসারে , সীমাবদ্ধতার জন্য ব্যবহৃত কলামগুলির উপরে সূচি তৈরি না করা হলে ক্যোয়ারী কোনও সূচক থেকে উপকৃত হবে না।
আমার এই সংজ্ঞা আছে:
CREATE TABLE [dbo].[JobItems] (
[ItemId] UNIQUEIDENTIFIER NOT NULL,
[ItemState] INT NOT NULL,
[ItemPriority] INT NOT NULL,
[CreationTime] DATETIME NULL DEFAULT GETUTCDATE(),
[LastAccessTime] DATETIME NULL DEFAULT GETUTCDATE(),
-- other columns
);
CREATE UNIQUE CLUSTERED INDEX [JobItemsIndex]
ON [dbo].[JobItems]([ItemId] ASC);
GO
CREATE INDEX [GetItemToProcessIndex]
ON [dbo].[JobItems]([ItemState], [ItemPriority], [CreationTime])
INCLUDE (LastAccessTime);
GO
এবং এই ক্যোয়ারী:
UPDATE TOP (150) JobItems
SET ItemState = 17
WHERE
ItemState IN (3, 9, 10)
AND LastAccessTime < DATEADD (day, -2, GETUTCDATE())
AND CreationTime < DATEADD (day, -2, GETUTCDATE());
আমি প্রকৃত পরিকল্পনাটি পর্যালোচনা করেছি, এবং প্রেডিকেটের সাথে ঠিক একই সূচকের সন্ধান পেয়েছি WHERE
- LastAccessTime
সূচকটির অংশ না হয়ে সূচকটিতে কেবল "অন্তর্ভুক্ত" থাকা সত্ত্বেও পুনরুদ্ধার করার জন্য কোনও অতিরিক্ত "বুকমার্ক লুকআপস" নেই ।
আমার কাছে এই আচরণটি এই নিয়মের সাথে বৈপরীত্য দেখাচ্ছে যে কলামটি অবশ্যই সূচকের অংশ হতে হবে, কেবল "অন্তর্ভুক্ত" নয়।
আমি কি আচরণটি সঠিকভাবে পালন করি? WHERE
অন্তর্ভুক্ত কলাম থেকে আমার সুবিধাগুলি বা কলামটি সূচকের অংশ হওয়ার প্রয়োজন হলে আমি কীভাবে অগ্রিম জানতে পারি ?
(ItemState, CreationTime) INCLUDE (LastAccessTime)
(a,b)
সাথে ক্যোয়ারির জন্য সেরা নয় SELECT a FROM t WHERE b=5;
এবং এটিতে একটি সূচক (b) INCLUDE (a)
আরও ভাল।
ItemState
মানের উপর ভিত্তি করে সন্ধান করতে পারে, তবে অনুসন্ধানটি ততটা দক্ষ হবে না যেমন আপনার সূচকটি নীচের মতো কাঠামোযুক্ত হয়েছিল(ItemState, CreationTime, LastAccessTime)