L'ottimizzatore pensa che la scansione completa della tabella sarà migliore.
Se sono presenti solo pochi NULL
righe, l'ottimizzatore ha ragione.
Se sei assolutamente sicuro che l'accesso all'indice sarà più veloce (cioè hai più del 75%
righe con col1 IS NULL
), quindi suggerisci la tua domanda:
SELECT /*+ INDEX (t index_name_on_col1) */
*
FROM mytable t
WHERE col1 IS NOT NULL
Perché 75%
?
Perché usando INDEX SCAN
recuperare valori non coperti dall'indice implica un join nascosto su ROWID
, che costa circa 4
volte tanto quanto la scansione della tabella.
Se l'intervallo dell'indice include più del 25%
di righe, la scansione della tabella è generalmente più veloce.
Come menzionato da Tony Andrews
, il fattore di raggruppamento è un metodo più accurato per misurare questo valore, ma 25%
è ancora una buona regola pratica.