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

Perché l'indice non viene utilizzato per questa query?

AGGIORNAMENTO: Prova a rendere la colonna col NOT NULL. Questo è il motivo per cui non utilizza l'indice. Quando non è nullo, ecco il piano.

SELECT STATEMENT, GOAL = ALL_ROWS           69  10  30
                    HASH GROUP BY           69  10  30
 INDEX FAST FULL SCAN   SANDBOX TEST_INDEX  56  98072   294216

Se l'ottimizzatore determina che è più efficiente NON utilizzare l'indice (forse a causa della riscrittura della query), non lo farà. I suggerimenti dell'ottimizzatore sono proprio questo, vale a dire suggerimenti per indicare a Oracle un indice che ti piacerebbe da usare. Puoi pensarli come suggerimenti. Ma se l'ottimizzatore determina che è meglio non utilizzare l'indice (di nuovo, come risultato della riscrittura della query, ad esempio), allora non lo farà.

Fare riferimento a questo link:http://download. oracle.com/docs/cd/B19306_01/server.102/b14211/hintsref.htm "La specificazione di uno di questi suggerimenti fa sì che l'ottimizzatore scelga il percorso di accesso specificato solo se il percorso di accesso è disponibile in base all'esistenza di un indice o cluster e sui costrutti sintattici dell'istruzione SQL. Se un suggerimento specifica un percorso di accesso non disponibile, quindi l'ottimizzatore lo ignora."

Poiché stai eseguendo un'operazione di conteggio(*), l'ottimizzatore ha stabilito che è più efficiente eseguire la scansione dell'intera tabella e l'hash invece di utilizzare il tuo indice.

Ecco un altro collegamento utile sui suggerimenti:http://www.dba-oracle.com/t_hint_ignored. htm