Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Index wegen Typkonvertierung nicht verwendet?

ein implizites Die Konvertierung kann verhindern, dass ein Index vom Optimierer verwendet wird. Bedenken Sie:

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

Dies ist eine einfache Tabelle, aber der Datentyp ist nicht "richtig", dh wenn Sie sie so abfragen, wird sie vollständig gescannt:

SQL> select * from a where id = 100;
 
ID
----------
100

Diese Abfrage ist tatsächlich äquivalent zu:

select * from a where to_number(id) = 100;

Es kann den Index nicht verwenden, da wir id indiziert haben und nicht to_number(id) . Wenn wir den Index verwenden wollen, müssen wir explizit sein :

select * from a where id = '100';

Antwort auf den Kommentar von pakr: Es gibt viele Regeln für implizite Konvertierungen. Ein guter Ausgangspunkt ist Dokumentation . Unter anderem erfahren wir Folgendes:

Dies bedeutet, dass eine implizite Konvertierung während eines "WHERE column=variable" erfolgt -Klausel konvertiert Oracle den Datentyp der Spalte und NICHT der Variablen, wodurch verhindert wird, dass ein Index verwendet wird. Aus diesem Grund sollten Sie immer die richtigen Datentypen verwenden oder die Variable explizit konvertieren.

Aus dem Oracle-Dokument: