een impliciete conversie kan voorkomen dat een index door de optimizer wordt gebruikt. Overweeg:
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
Dit is een eenvoudige tabel, maar het datatype is niet 'juist', d.w.z. als je het op deze manier opvraagt, wordt het volledig gescand:
SQL> select * from a where id = 100;
ID
----------
100
Deze zoekopdracht is in feite gelijk aan:
select * from a where to_number(id) = 100;
Het kan de index niet gebruiken omdat we id
hebben geïndexeerd en niet to_number(id)
. Als we de index willen gebruiken, moeten we expliciet . zijn :
select * from a where id = '100';
Als antwoord op de opmerking van pakr: Er zijn veel regels met betrekking tot impliciete conversies. Een goede plek om te beginnen is de documentatie . We leren onder andere dat:
Dit betekent dat wanneer impliciete conversie plaatsvindt tijdens een "WHERE column=variable"
clausule, zal Oracle het datatype van de kolom converteren en NIET van de variabele, waardoor wordt voorkomen dat een index wordt gebruikt. Dit is waarom je altijd het juiste soort datatypes moet gebruiken of de variabele expliciet moet converteren.
Uit het Oracle-document: