Supongamos que tenemos una definición de tabla como esta:
CREATE TABLE MyTab (
ID INT IDENTITY(1,1) CONSTRAINT PK_MyTab_ID PRIMARY KEY
,GroupByColumn NVARCHAR(10) NOT NULL
,WhereColumn DATETIME NULL
)
Y un índice filtrado no agrupado como este:
CREATE NONCLUSTERED INDEX IX_MyTab_GroupByColumn ON MyTab
(GroupByColumn)
WHERE (WhereColumn IS NULL)
Por qué este índice no está "cubriendo" para esta consulta:
SELECT
GroupByColumn
,COUNT(*)
FROM MyTab
WHERE WhereColumn IS NULL
GROUP BY GroupByColumn
Estoy recibiendo este plan de ejecución:
KeyLookup es para el predicado WhereColumn IS NULL.
Aquí está el plan: https://www.brentozar.com/pastetheplan/?id=SJcbLHxO7
Tuve el mismo problema que creo cuando hice algunas pruebas hace semanas. Tengo una consulta con un predicado primario que requiere que los resultados devueltos tengan un tiempo de cierre NULL y pensé en usar un índice filtrado ya que 25K de 2M + registros son NULL y esta cifra disminuirá muy pronto.
El índice filtrado no se usó, supuse debido a 'no unicidad' o comunalidad, hasta que encontré un artículo de soporte de Microsoft que dice:
Por lo tanto, agregar la columna al Índice (o Incluir) parece ser la respuesta oficial de MS.
fuente