имплицитно преобразуването може да предотврати използването на индекс от оптимизатора. Помислете за следното:
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
Това е проста таблица, но типът данни не е „правилен“, т.е. ако я запитате по този начин, тя ще сканира напълно:
SQL> select * from a where id = 100;
ID
----------
100
Тази заявка всъщност е еквивалентна на:
select * from a where to_number(id) = 100;
Не може да използва индекса, тъй като индексирахме id
а не to_number(id)
. Ако искаме да използваме индекса, ще трябва да сме изрични :
select * from a where id = '100';
В отговор на коментара на pakr: Има много правила относно неявните преобразувания. Едно добро място за започване е документация . Освен всичко друго научаваме, че:
Това означава, че когато неявното преобразуване се случи по време на "WHERE column=variable"
клауза, Oracle ще преобразува типа данни на колоната, а НЕ на променливата, като по този начин предотвратява използването на индекс. Ето защо винаги трябва да използвате правилния вид типове данни или изрично преобразуване на променливата.
От документа на Oracle: