El optimizador tomará su decisión en función del costo relativo de la exploración de tabla completa y el uso del índice. Esto se reduce principalmente a cuántos bloques tendrán que leerse para satisfacer la consulta. La regla de 25%/75% mencionada en otra respuesta es simplista: en algunos casos, una exploración completa de la tabla tendrá sentido incluso para obtener el 1% de las filas, es decir, si esas filas se distribuyen en muchos bloques.
Por ejemplo, considere la siguiente tabla:
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
Como se puede ver, sólo aproximadamente el 1% de las filas de T1 tiene un object_id no nulo.Pero debido a la forma en que construí la tabla, estas 861 filas se distribuirán más o menos uniformemente alrededor de la mesa. Por lo tanto, la consulta:
select * from t1 where object_id is not null;
es probable que visitar casi todos los bloques de la T1 para obtener los datos, incluso si el optimizador utiliza el índice. ¡Tiene sentido entonces prescindir del índice y realizar un escaneo completo de la tabla!
Una estadística clave para ayudar a identificar esta situación es el factor de índice de agrupación:
SQL> select clustering_factor from user_indexes where index_name='T1_IDX';
CLUSTERING_FACTOR
-----------------
460
Este valor 460 es bastante alto (en comparación con las 861 filas en el índice), y sugiere que un escaneo completo de tabla se ser usado. Ver this DBAZine article on clustering factors.
Quassnoi, ¿de dónde sacas ese 75%? Si hay un millón de filas y solo una es nula, ¿por qué el uso de un índice en esas columnas sería más lento que una exploración de tabla? – tpdi
Porque el índice implica una unión oculta en ROWID, que cuesta aproximadamente 4 veces más que la exploración de tabla. Si la selectividad del índice es inferior al 25%, la exploración de la tabla suele ser más rápida. – Quassnoi
En una exploración de tabla completa, simplemente itera sobre todas las filas de la tabla; si realiza un escaneo de índice, primero debe leer el índice y luego leer la tabla. Desde cierto punto, el costo de leer un índice es más alto que simplemente leer toda la tabla. – andri