Eu tenho uma tabela bastante grande (500 milhões de linhas, 30 colunas de largura, cerca de 130 GB de dados no total). Uma das colunas dessa tabela é um tipo de dados DateTime e preciso selecionar repetidamente os registros dessa tabela em um determinado intervalo de datas. Parece um bom candidato para um índice filtrado para mim.
Este é o meu índice filtrado:
CREATE NONCLUSTERED INDEX IX_Filtered_Table1_DateField1
ON Table1 (DateField1, PrimaryKeyField)
WHERE (DateField1 >= '2/24/20' AND DateField1 < '4/14/20')
Esta é a minha consulta:
DECLARE @MinPrimaryKeyId BIGINT = 2854868995
SELECT TOP 500000 PrimaryKeyField
INTO #Results
FROM Table1 WITH(INDEX(IX_Filtered_Table1_DateField1))
WHERE DateField1 >= '2/24/20'
and DateField1 < '4/14/20'
and PrimaryKeyField > @MinPrimaryKeyId
ORDER BY PrimaryKeyField ASC
Ao verificar o plano de execução, percebo que ele está usando meu índice filtrado, mas o padrão é uma operação de verificação de índice em vez de uma busca de índice.
Se eu tentar usar a dica de consulta FORCESEEK (além da minha dica de índice), recebo o erro clássico:
O processador de consulta não pôde produzir um plano de consulta devido às dicas definidas nesta consulta
Por que o processador de consultas não poderia gerar um plano de execução usando uma operação Seek nesse índice quando pode fazer uma operação Scan com ele? (Se eu trocar minha dica de consulta FORCESEEK por um FORCESCAN, ela funcionará, o que eu sei que não é diferente de não usar uma dica aqui.)
O SQL não pode "Procurar" porque a ordem desse índice é primeiro por data e depois por PrimaryKey. Como você está selecionando com uma data que corresponde ao conteúdo completo do índice e como as PrimaryKeys não estão ordenadas (elas estão apenas dentro de cada data específica), o SQL precisa escaneá-la.
Tente alterar seu índice para este:
Sql deve então ser capaz de usá-lo (como a correspondência de data) e procurar no PrimaryKeyField (e a dica provavelmente não será necessária, pois isso provavelmente será o que o SQL decidirá fazer de qualquer maneira)