Optymalizator podejmie decyzję na podstawie względnego kosztu pełnego skanowania tabeli i korzystania z indeksu. To głównie sprowadza się do tego, ile bloków trzeba będzie przeczytać, aby spełnić zapytanie. Reguła 25%/75% wspomniana w innej odpowiedzi jest uproszczona: w niektórych przypadkach pełne skanowanie tabeli ma sens nawet w przypadku uzyskania 1% wierszy - tj. Jeśli te wiersze rozłożą się wokół wielu bloków.
Na przykład, rozważmy tę tabelę:
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
Jak widać, tylko około 1% wierszy T1 mają niezerową object_id.Ale ze względu na sposób, w jaki zbudowałem stół, te 861 rzędów rozłożą się mniej więcej równomiernie wokół stołu. Dlatego zapytanie:
select * from t1 where object_id is not null;
może odwiedzić prawie każdy blok w T1, aby uzyskać dane, nawet jeśli optymalizator użył indeksu. Warto wtedy zrezygnować z indeksu i przejść do pełnego skanowania tabeli!
Kluczowym statystyka aby pomóc w identyfikacji tej sytuacji jest czynnikiem wskaźnik klastrów:
SQL> select clustering_factor from user_indexes where index_name='T1_IDX';
CLUSTERING_FACTOR
-----------------
460
Wartość 460 jest bardzo wysoka (w porównaniu do 861 wierszy w indeksie), i sugeruje, że pełne skanowanie tabela być użytym. Zobacz this DBAZine article on clustering factors.
Quassnoi, gdzie dostaniesz 75%? Jeśli istnieje milion wierszy i tylko jeden ma wartość NULL, dlaczego użycie indeksu na tych kolumnach będzie wolniejsze niż skanowanie tabeli? – tpdi
Ponieważ indeks implikuje ukryte sprzężenie na ROWID, co kosztuje około 4 razy więcej niż skanowanie tabeli. Czy selektywność indeksów jest mniejsza niż 25%, skanowanie tabeli jest zwykle szybsze. – Quassnoi
W pełnym widoku tabeli po prostu przejrzyj wszystkie wiersze w tabeli; jeśli wykonasz skanowanie indeksu, najpierw musisz odczytać indeks, a potem odczytać tabelę. Od pewnego momentu koszt czytania indeksu jest wyższy niż po prostu odczytanie całej tabeli. – andri