sql >> Databáze >  >> RDS >> Oracle

Nebyl použit index kvůli konverzi typu?

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:



  1. Levé vnější připojení v Postgres nevrací hodnoty pro Null

  2. Velké tabulky a analýzy v MySql

  3. SQL:vyhledat/nahradit, ale pouze při prvním zobrazení hodnoty v záznamu

  4. Mám indexovat bitové pole na serveru SQL Server?