Oracle
 sql >> Database >  >> RDS >> Oracle

Oracle 10g - ottimizza DOVE NON È NULLO

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.