Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Índice não usado devido à conversão de tipo?


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: