De acordo com esta resposta , a menos que um índice seja criado sobre as colunas usadas para restringir, a consulta não será beneficiada por um índice.
Eu tenho esta definição:
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
e esta consulta:
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());
Revisei o plano real e há apenas uma pesquisa de índice com o predicado exatamente como em WHERE
- nenhuma "pesquisa de favoritos" adicional a ser recuperada, LastAccessTime
mesmo que a última seja apenas "incluída" no índice, não parte do índice.
Parece-me que esse comportamento contradiz a regra de que a coluna deve fazer parte do índice, e não apenas "incluída".
O comportamento que observo é o correto? Como posso saber com antecedência se meus WHERE
benefícios de uma coluna incluída ou precisam que a coluna faça parte do índice?
(ItemState, CreationTime) INCLUDE (LastAccessTime)
(a,b)
não é o melhor para uma consulta SELECT a FROM t WHERE b=5;
e que um índice ativado (b) INCLUDE (a)
é muito melhor.
ItemState
valor, no entanto, a busca não será tão eficiente como se o seu Índice foi estruturado da seguinte forma(ItemState, CreationTime, LastAccessTime)