sql >> Databasteknik >  >> RDS >> Oracle

Index används inte på grund av typkonvertering?

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:



  1. Uppdateringar av JSON-fältet kvarstår inte i DB

  2. PostgreSQL 11:Vad är nytt

  3. Använder GO inom en transaktion

  4. Stumped SQL-undantag för JDBC