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

Indice non utilizzato a causa della conversione del tipo?

un implicito la conversione può impedire l'utilizzo di un indice da parte dell'ottimizzatore. Considera:

SQL> CREATE TABLE a (ID VARCHAR2(10) PRIMARY KEY);
 
Table created
 
SQL> insert into a select rownum from dual connect by rownum <= 1e6;
 
1000000 rows inserted

Questa è una tabella semplice ma il tipo di dati non è 'corretto', ad es. se la interroghi in questo modo verrà eseguita la scansione completa:

SQL> select * from a where id = 100;
 
ID
----------
100

Questa query è infatti equivalente a:

select * from a where to_number(id) = 100;

Non può utilizzare l'indice poiché abbiamo indicizzato id e non to_number(id) . Se vogliamo utilizzare l'indice dovremo essere espliciti :

select * from a where id = '100';

In risposta al commento di pakr: Ci sono molte regole relative alle conversioni implicite. Un buon punto di partenza è documentazione . Tra le altre cose, apprendiamo che:

Significa che quando si verifica una conversione implicita durante un "WHERE column=variable" clausola, Oracle convertirà il tipo di dati della colonna e NON della variabile, impedendo quindi l'utilizzo di un indice. Questo è il motivo per cui dovresti sempre usare il giusto tipo di tipi di dati o convertire esplicitamente la variabile.

Dal documento Oracle: