en implicit konvertering kan forhindre et indeks i at blive brugt af optimeringsværktøjet. Overvej:
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
Dette er en simpel tabel, men datatypen er ikke 'rigtig', dvs. hvis du forespørger på den sådan her vil den fuld scanning:
SQL> select * from a where id = 100;
ID
----------
100
Denne forespørgsel svarer faktisk til:
select * from a where to_number(id) = 100;
Den kan ikke bruge indekset, da vi indekserede id
og ikke to_number(id)
. Hvis vi vil bruge indekset, skal vi være eksplicit :
select * from a where id = '100';
Som svar på pakrs kommentar: Der er masser af regler om implicitte konverteringer. Et godt sted at starte er dokumentation . Vi lærer blandt andet at:
Det betyder, at når implicit konvertering finder sted under en "WHERE column=variable"
klausul, vil Oracle konvertere datatypen for kolonnen og IKKE for variablen, hvilket forhindrer et indeks i at blive brugt. Det er derfor, du altid bør bruge den rigtige type datatyper eller eksplicit konvertere variablen.
Fra Oracle-dokumentet: