Optymalizator uważa, że pełne skanowanie tabeli będzie lepsze.
Jeśli jest tylko kilka NULL
wierszy, optymalizator ma rację.
Jeśli masz absolutną pewność, że dostęp do indeksu będzie szybszy (to znaczy, że masz więcej niż 75%
wiersze z col1 IS NULL
), a następnie podpowiedz swoje zapytanie:
SELECT /*+ INDEX (t index_name_on_col1) */
*
FROM mytable t
WHERE col1 IS NOT NULL
Dlaczego 75%
?
Ponieważ używanie INDEX SCAN
pobieranie wartości nieobjętych indeksem oznacza ukryte sprzężenie w ROWID
, co kosztuje około 4
razy więcej niż skanowanie tabeli.
Jeśli zakres indeksu obejmuje więcej niż 25%
wierszy, skanowanie tabeli jest zwykle szybsze.
Jak wspomniał Tony Andrews
, współczynnik grupowania jest dokładniejszą metodą pomiaru tej wartości, ale 25%
to nadal dobra zasada.