L'index filtré search la condition `is NULL` et search l'opposé

Supposons qu'il y a une table comme:

create table #data (ID int identity(1, 1) not NULL, Value int) 

Mettez quelques données dedans:

 insert into #data (Value) select top (1000000) case when (row_number() over (order by @@spid)) % 5 in (0, 1) then 1 else NULL end from sys.all_columns c1, sys.all_columns c2 

Et deux index:

 create index #ix_data_n on #data (Value) include (ID) where Value is NULL create index #ix_data_nn on #data (Value) include (ID) where Value is not NULL 

Les données sont interrogées comme:

 select ID from #data where Value is NULL 

ou

 select ID from #data where Value is not NULL 

Si j'examine le plan de requête, je vois que dans la première search d'index de cas est effectuée et dans le second cas l'parsing d'index est exécutée. Pourquoi cherche-t-il dans le premier cas et scanne dans le second?

Ajout après commentaires:

Si je crée un indice de couverture ordinaire au lieu de deux couvertures filtrées:

 create index #ix_data on #data (Value) include (ID) 

Le plan de requête montre que la search d'index pour les deux is NULL et is not NULL , sans tenir count du% des valeurs NULL dans la colonne (0% de NULL ou 10% ou 90% ou 100%, pas d'importance). Lorsqu'il existe deux index filtrés, le plan de requête montre que la search d'index is NULL toujours is NULL et peut être un scan d'index ou un scan de table (selon le% des NULL), mais ce n'est jamais une search d'index. Ainsi, semble-t-il, la différence réside essentiellement dans la manière dont la condition 'n'est pas NULL'.

Cela signifie, probablement, que si l'index est destiné à la vérification 'n'est pas NULL', alors l'index normal ou l'index filtré devrait mieux fonctionner et être préféré, n'est-ce pas? Laquelle?

SqlServer 2008, 2008r2 et 2012

Le Seek vs Scan dans les plans de requête que vous voyez est un rouge-hareng.

Dans les deux cas, la requête est résolue en analysant l'index non-cluster approprié du début à la fin, en returnnant chaque ligne.

En examinant le plan de requête XML, vous pouvez voir que le prédicat Index Seek est "# data.Value = Opérateur scalaire (Null)", ce qui n'a pas de sens car chaque ligne répond à ces critères.