¿Por qué no se utiliza el índice filtrado en el valor IS NULL?


18

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:

ingrese la descripción de la imagen aquí

KeyLookup es para el predicado WhereColumn IS NULL.

Aquí está el plan: https://www.brentozar.com/pastetheplan/?id=SJcbLHxO7

Respuestas:


23

Por qué este índice no está "cubriendo" para esta consulta:

No hay buena razón Ese es un índice de cobertura para esa consulta.

Vota por el artículo de devolución aquí: https://feedback.azure.com/forums/908035-sql-server/suggestions/32896348-filtered-index-not-used-when-is-null-and-key-looku

Y como solución alternativa incluya el WhereColumnen el índice filtrado:

CREATE NONCLUSTERED INDEX IX_MyTab_GroupByColumn 
ON MyTab (GroupByColumn) include (WhereColumn)
WHERE (WhereColumn IS NULL) 

13
Esto fue informado hace más de una década por Gail Shaw. Entonces Connect murió. Lo más cercano que puedo encontrar ahora es feedback.azure.com/forums/908035-sql-server/suggestions/…
Paul White 9

3

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:

Para resolver este problema, incluya la columna que se prueba como NULL en las columnas devueltas. O bien, agregue esta columna como columnas de inclusión en el índice.

Por lo tanto, agregar la columna al Índice (o Incluir) parece ser la respuesta oficial de MS.


1
Es una solución viable, hasta cuando (y si) lo arreglan.
ypercubeᵀᴹ
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.