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 CASE
expression, 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;