Comment indexer les requêtes d'inégalité?


10

J'ai une requête qui exclut des données basées sur la valeur d'une colonne flottante

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

Je ne veux pas indexer un type flottant si je peux l'aider. Le plan d'exécution serait-il assez intelligent pour utiliser un index filtré comme ci-dessous (où je n'indexe que les valeurs 0 et null) pour augmenter les performances?

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

Réponses:


11

Le plan d'exécution serait-il assez intelligent pour utiliser un index filtré comme ci-dessous (où je n'indexe que les valeurs 0 et null) pour augmenter les performances?

Non. Il n'y a pas de prise en charge directe dans SQL Server pour le type de rejet de ligne à opérateur unique que vous semblez avoir en tête.

De manière plus générale, l'index filtré n'est pas directement utile pour la requête donnée et n'est de toute façon pas une définition de filtre d'index valide. Vous pouvez créer une vue indexée contenant ces prédicats à la place, mais cela ne serait toujours pas utile pour localiser les lignes de la requête cible. Vous pouvez réécrire la requête pour utiliser la vue indexée pour exclure les lignes extraites avec une analyse complète distincte, mais il est difficile de voir comment ce serait une bonne idée en général.

Le plus proche que vous pourriez obtenir serait probablement une analyse de la vue indexée remplissant un filtre bitmap, avec ce filtre appliqué dans le cadre d'une analyse complète de la table cible. Il peut être difficile d'obtenir cette forme de plan de requête de manière fiable.

Vous pouvez également utiliser une colonne calculée persistante indexée à l'aide d'une CASEexpression, mais là encore, cela nécessiterait de réécrire la requête d'origine et nécessiterait du stockage pour chaque ligne de la table, plus l'index.

D'après les informations fournies, il semble que le mieux que vous puissiez faire est de définir l'index comme:

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;
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.