¿Cómo indexar las consultas de desigualdad?


10

Tengo una consulta que excluye datos basados ​​en el valor de una columna flotante

select * 
from My_Table
where my_Float_column != 0 and my_Float_column is not null

No quiero indexar un tipo flotante si puedo evitarlo. ¿El plan de ejecución sería lo suficientemente inteligente como para usar un índice filtrado como el siguiente (donde solo indizo los valores 0 y nulos) para aumentar el rendimiento?

CREATE NONCLUSTERED INDEX IX_My_Table_Float_Filtered
    ON My_Table (my_Float_column)
    WHERE my_Float_column = 0 or my_Float_column is null

Respuestas:


11

¿El plan de ejecución sería lo suficientemente inteligente como para usar un índice filtrado como el siguiente (donde solo indizo los valores 0 y nulos) para aumentar el rendimiento?

No. No hay soporte directo en SQL Server para el tipo de rechazo de fila de un solo operador que parece tener en mente.

En términos más generales, el índice filtrado no es directamente útil para la consulta dada, y de todos modos no es una definición de filtro de índice válida. En su lugar, podría crear una vista indizada que contenga esos predicados, pero aún así no sería útil para localizar filas para la consulta de destino. Puede volver a escribir la consulta para usar la vista indizada para excluir filas obtenidas con un escaneo completo por separado, pero es difícil ver cómo sería una buena idea en general.

Probablemente, lo más cercano que podría obtener sería un escaneo de la vista indexada que contiene un filtro de mapa de bits, con ese filtro aplicado como parte de un escaneo completo de la tabla de destino. Puede ser un desafío obtener la forma de este plan de consulta de manera confiable.

También podría usar una columna calculada persistente indexada usando una CASEexpresión, pero nuevamente esto requeriría reescribir la consulta original, y requeriría almacenamiento para cada fila de la tabla, más el índice.

De la información dada, parece que lo mejor que puede hacer es definir el índice como:

CREATE NONCLUSTERED INDEX IX_dbo_My_Table__Float_Filtered
ON dbo.My_Table (my_Float_column)
WHERE 
    my_Float_column <> 0 
    AND my_Float_column IS NOT NULL;
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.