ตามคำตอบนี้เว้นแต่ว่าดัชนีจะถูกสร้างขึ้นเหนือคอลัมน์ที่ใช้ในการ จำกัด การสืบค้นจะไม่ได้รับประโยชน์จากดัชนี
ฉันมีคำจำกัดความนี้:
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
ค่าอย่างไรก็ตาม Seek จะไม่มีประสิทธิภาพเหมือนกับว่าดัชนีของคุณมีโครงสร้างดังนี้(ItemState, CreationTime, LastAccessTime)