un implícito la conversión puede evitar que el optimizador utilice un índice. Considere:
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
Esta es una tabla simple pero el tipo de datos no es 'correcto', es decir, si lo consulta de esta manera, se escaneará por completo:
SQL> select * from a where id = 100;
ID
----------
100
Esta consulta es de hecho equivalente a:
select * from a where to_number(id) = 100;
No puede usar el índice ya que indexamos id
y no to_number(id)
. Si queremos usar el índice tendremos que ser explícitos :
select * from a where id = '100';
En respuesta al comentario de pakr: Hay muchas reglas relativas a las conversiones implícitas. Un buen lugar para comenzar es documentación . Entre otras cosas, aprendemos que:
Significa que cuando se produce una conversión implícita durante un "WHERE column=variable"
cláusula, Oracle convertirá el tipo de datos de la columna y NO de la variable, por lo tanto, evitará que se use un índice. Esta es la razón por la que siempre debe usar el tipo correcto de tipos de datos o convertir explícitamente la variable.
Del documento de Oracle: