Bu cevaba göre , kısıtlamak için kullanılan sütunlar üzerine bir indeks oluşturulmadıkça, sorgu bir endeksten faydalanmayacaktır.
Bu tanım var:
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
ve bu sorgu:
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());
Ben gerçek planı gözden geçirdi, ve sadece bir dizin arama tam olarak olduğu gibi WHERE
- ek hiçbir "yer imi aramaları" LastAccessTime
, ikincisi sadece bir "dizin" dizinine dahil, "dahil" olsa bile.
Bana öyle geliyor ki bu davranış, sütunun sadece "dahil" değil, dizinin bir parçası olması gerektiği kuralıyla çelişiyor.
Gözlemlediğim davranış doğru mu? Eklenen WHERE
bir sütunun sağladığı yararlarımın veya sütunun dizinin bir parçası olması gerektiğini önceden nasıl anlayabilirim ?
(ItemState, CreationTime) INCLUDE (LastAccessTime)
(a,b)
için bir sorgu için en iyi olmadığını SELECT a FROM t WHERE b=5;
ve bir dizin üzerinde (b) INCLUDE (a)
çok daha iyi olduğunu söylüyor .
ItemState
değere göre arama yapabilir , ancak Arama, Endeksiniz aşağıdaki gibi yapılandırılmış gibi verimli olmayacaktır(ItemState, CreationTime, LastAccessTime)