implicitní konverze může zabránit použití indexu optimalizátorem. Zvažte:
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
Toto je jednoduchá tabulka, ale datový typ není 'správný', tj. pokud se na ni dotazujete takto, prohledá se celá:
SQL> select * from a where id = 100;
ID
----------
100
Tento dotaz je ve skutečnosti ekvivalentní:
select * from a where to_number(id) = 100;
Nemůže použít index, protože jsme indexovali id
a ne to_number(id)
. Pokud chceme index používat, musíme být explicitní :
select * from a where id = '100';
Odpověď na pakrův komentář: Existuje mnoho pravidel týkajících se implicitních převodů. Jedním dobrým místem pro začátek je dokumentace . Mimo jiné se dozvídáme, že:
To znamená, že když dojde k implicitní konverzi během "WHERE column=variable"
klauzule, Oracle převede datový typ sloupce a NOT proměnné, čímž zabrání použití indexu. To je důvod, proč byste měli vždy používat správný druh datových typů nebo explicitně převádět proměnnou.
Z dokumentu Oracle: