ukryty konwersja może uniemożliwić użycie indeksu przez optymalizator. Rozważ:
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
To jest prosta tabela, ale typ danych nie jest „właściwy”, tj. jeśli zapytasz go w ten sposób, nastąpi pełne skanowanie:
SQL> select * from a where id = 100;
ID
----------
100
To zapytanie jest w rzeczywistości równoważne z:
select * from a where to_number(id) = 100;
Nie może używać indeksu, ponieważ zindeksowaliśmy id
a nie to_number(id)
. Jeśli chcemy użyć indeksu, musimy być wyraźni :
select * from a where id = '100';
W odpowiedzi na komentarz pakr: Istnieje wiele reguł dotyczących konwersji niejawnych. Dobrym miejscem na rozpoczęcie jest dokumentacja . Między innymi dowiadujemy się, że:
Oznacza to, że gdy niejawna konwersja występuje podczas "WHERE column=variable"
klauzula Oracle skonwertuje typ danych kolumny, a NIE zmiennej, zapobiegając w ten sposób użyciu indeksu. Dlatego zawsze powinieneś używać właściwych typów danych lub jawnie konwertować zmienną.
Z dokumentu Oracle: