um implícito a conversão pode impedir que um índice seja usado pelo otimizador. Considerar:
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 é uma tabela simples, mas o tipo de dados não está 'correto', ou seja, se você consultar assim, ele fará uma verificação completa:
SQL> select * from a where id = 100;
ID
----------
100
Esta consulta é de fato equivalente a:
select * from a where to_number(id) = 100;
Ele não pode usar o índice, pois indexamos
id
e não to_number(id)
. Se quisermos usar o índice, teremos que ser explícito :select * from a where id = '100';
Em resposta ao comentário de pakr: Existem muitas regras sobre conversões implícitas. Um bom lugar para começar é o documentação . Entre outras coisas, aprendemos que:
Isso significa que quando a conversão implícita ocorre durante um
"WHERE column=variable"
cláusula, o Oracle irá converter o tipo de dados da coluna e NÃO da variável, evitando assim que um índice seja usado. É por isso que você deve sempre usar o tipo certo de tipos de dados ou converter explicitamente a variável. Do documento da Oracle: