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 :