L'optimiseur pense que l'analyse complète de la table sera meilleure.
S'il n'y a que quelques NULL lignes, l'optimiseur a raison.
Si vous êtes absolument sûr que l'accès à l'index sera plus rapide (c'est-à-dire que vous avez plus de 75% lignes avec col1 IS NULL ), puis indiquez votre requête :
SELECT /*+ INDEX (t index_name_on_col1) */
*
FROM mytable t
WHERE col1 IS NOT NULL
Pourquoi 75% ?
Parce qu'utiliser INDEX SCAN récupérer des valeurs non couvertes par l'index implique une jointure masquée sur ROWID , qui coûte environ 4 fois plus que le balayage de table.
Si la plage d'index comprend plus de 25% de lignes, l'analyse de la table est généralement plus rapide.
Comme mentionné par Tony Andrews , le facteur de regroupement est une méthode plus précise pour mesurer cette valeur, mais 25% est toujours une bonne règle de base.