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: