sql >> Base de Datos >  >> RDS >> Oracle

¿No se utiliza el índice debido a la conversión de tipos?

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: