sql >> Database teknologi >  >> RDS >> Oracle

Indeks ikke brugt på grund af typekonvertering?

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:



  1. psycopg2 og SQL-injektionssikkerhed

  2. Sådan sender du varchar med enkelte citater til Stored Proc i Oracle

  3. Indlejrede klasser - CustomRowMapper !! Ikke et problem længere !! - Del 1

  4. Send array fra Java til Oracle:java.sql.SQLEundtagelse:Kunne ikke konvertere til intern repræsentation:fejl