Oracle
 sql >> Base de données >  >> RDS >> Oracle

Index non utilisé en raison d'une conversion de type ?

un implicite la conversion peut empêcher l'utilisation d'un index par l'optimiseur. Considérez :

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

Il s'agit d'un tableau simple mais le type de données n'est pas "correct", c'est-à-dire que si vous l'interrogez comme ceci, il effectuera une analyse complète :

SQL> select * from a where id = 100;
 
ID
----------
100

Cette requête est en fait équivalente à :

select * from a where to_number(id) = 100;

Il ne peut pas utiliser l'index puisque nous avons indexé id et non to_number(id) . Si nous voulons utiliser l'index, nous devrons être explicites :

select * from a where id = '100';

En réponse au commentaire de pakr : Il existe de nombreuses règles concernant les conversions implicites. Un bon point de départ est le documentation . Entre autres choses, nous apprenons que :

Cela signifie que lorsqu'une conversion implicite se produit lors d'une "WHERE column=variable" clause, Oracle convertira le type de données de la colonne et NOT de la variable, empêchant ainsi l'utilisation d'un index. C'est pourquoi vous devez toujours utiliser le bon type de types de données ou convertir explicitement la variable.

À partir de la documentation Oracle :