en implicit konvertering kan förhindra att ett index används av optimeraren. Tänk på:
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
Det här är en enkel tabell men datatypen är inte "rätt", dvs om du frågar den så här kommer den att genomsökas:
SQL> select * from a where id = 100;
ID
----------
100
Denna fråga motsvarar i själva verket:
select * from a where to_number(id) = 100;
Det kan inte använda indexet eftersom vi indexerade id
och inte to_number(id)
. Om vi vill använda indexet måste vi vara uttryckliga :
select * from a where id = '100';
Som svar på pakrs kommentar: Det finns många regler om implicita konverteringar. Ett bra ställe att börja är dokumentation . Vi lär oss bland annat att:
Det betyder att när implicit konvertering sker under en "WHERE column=variable"
Oracle kommer att konvertera datatypen för kolumnen och INTE för variabeln, vilket förhindrar att ett index används. Det är därför du alltid bör använda rätt typ av datatyper eller explicit konvertera variabeln.
Från Oracle-dokumentet: