Оптимизатор будет принимать решение на основе относительной стоимости полного сканирования таблицы и использования индекса. Это в основном сводится к тому, сколько блоков нужно будет прочитать для удовлетворения запроса. 25%/75% правило большого пальца, упомянутое в другом ответе, упрощено: в некоторых случаях полное сканирование таблицы имеет смысл даже для того, чтобы получить 1% строк - т. Е. Если эти строки будут распространяться по многим блокам.
Например, рассмотрим следующую таблицу:
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
Как вы можете видеть, только около 1% строк в T1 имеют ненулевой object_id.Но из-за того, как я построил таблицу, эти 861 строки будут распределены более или менее равномерно по таблице. Таким образом, запрос:
select * from t1 where object_id is not null;
, скорее всего, посетить почти каждый блок в T1, чтобы получить данные, даже если Оптимизатор использовал индекс. Тогда имеет смысл отказаться от индекса и перейти на полное сканирование таблицы!
Ключевая статистика, чтобы помочь идентифицировать эту ситуацию, является фактором, индекс кластеризации:
SQL> select clustering_factor from user_indexes where index_name='T1_IDX';
CLUSTERING_FACTOR
-----------------
460
Это значение 460 является довольно высоким (по сравнению с 861 строк в индексе), и предполагает, что полное сканирование таблицы будет использоваться. См. this DBAZine article on clustering factors.
Quassnoi, где вы получаете 75%? Если имеется миллион строк, и только один из них равен нулю, почему использование индекса в этих столбцах будет медленнее, чем сканирование таблицы? – tpdi
Поскольку индекс ссылается на скрытое соединение на ROWID, которое стоит примерно в 4 раза больше, чем сканирование таблицы. Является ли селективность индекса менее 25%, сканирование таблицы обычно происходит быстрее. – Quassnoi
В полном сканировании таблицы вы просто перебираете все строки таблицы; если вы выполняете сканирование индекса, вам сначала нужно прочитать индекс, а затем прочитать таблицу. С определенной точки стоимость чтения индекса выше, чем просто чтение всей таблицы. – andri