L'optimiseur prendra sa décision en fonction du coût relatif de l'analyse complète de la table et de l'utilisation de l'index. Cela revient principalement à combien de blocs devront être lus pour satisfaire la requête. La règle empirique de 25%/75% mentionnée dans une autre réponse est simpliste: dans certains cas, un balayage de table complet aura du sens même pour obtenir 1% des rangées - c'est-à-dire si ces rangées sont réparties sur plusieurs blocs.
Par exemple, considérez ce tableau:
SQL> create table t1 as select object_id, object_name from all_objects;
Table created.
SQL> alter table t1 modify object_id null;
Table altered.
SQL> update t1 set object_id = null
2 where mod(object_id,100) != 0
3/
84558 rows updated.
SQL> analyze table t1 compute statistics;
Table analyzed.
SQL> select count(*) from t1 where object_id is not null;
COUNT(*)
----------
861
Comme vous pouvez le voir, seulement environ 1% des lignes T1 ont un object_id non nul.Mais en raison de la façon dont j'ai construit la table, ces 861 lignes seront réparties plus ou moins uniformément autour de la table. Par conséquent, la requête:
select * from t1 where object_id is not null;
est susceptible de visiter presque chaque bloc dans T1 pour obtenir des données, même si l'optimiseur utilisé l'index. Il est donc logique de se passer de l'index et de faire un scan de table complet!
Une statistique clé pour aider à identifier cette situation est le facteur de regroupement d'index:
SQL> select clustering_factor from user_indexes where index_name='T1_IDX';
CLUSTERING_FACTOR
-----------------
460
Cette valeur 460 est assez élevé (par rapport aux 861 lignes dans l'index), et suggère qu'un scan de table sera être utilisé. Voir this DBAZine article on clustering factors.
Quassnoi, où obtenez-vous ce 75%? S'il y a un million de lignes et qu'une seule est nulle, pourquoi utiliser un index sur ces colonnes serait plus lent qu'un balayage de table? – tpdi
Parce que l'index impie une jointure cachée sur ROWID, ce qui coûte environ 4 fois plus que l'analyse de la table. Si la sélectivité de l'index est inférieure à 25%, l'analyse de la table est généralement plus rapide. – Quassnoi
Lors d'une analyse de table complète, vous parcourez simplement toutes les lignes de la table; Si vous effectuez une analyse d'index, vous devez d'abord lire l'index, puis lire la table. À partir d'un certain point, le coût de la lecture d'un index est plus élevé que la simple lecture de l'ensemble du tableau. – andri