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.