이 답변 에 따르면 , 제한하는 데 사용되는 열 위에 인덱스가 작성되지 않으면 쿼리는 인덱스의 이점을 얻지 못합니다.
나는이 정의를 가지고있다 :
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)