sql >> Database >  >> RDS >> Oracle

Index niet gebruikt vanwege typeconversie?

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:



  1. hoe de kolommen te verdelen in het resultaat van de query in de Oracle-database

  2. een panda-dataframe maken op basis van een databasequery die bindvariabelen gebruikt

  3. postgresql gelijk aan $mysqli->insert_id

  4. Opgeslagen procedure en een tijdelijke tabel vullen vanuit een gekoppelde opgeslagen procedure met parameters