Oracle
 sql >> база данни >  >> RDS >> Oracle

Индексът не се използва поради преобразуване на типа?

имплицитно преобразуването може да предотврати използването на индекс от оптимизатора. Помислете за следното:

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:



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Анализирайте xmltype в таблица след осевия xml

  2. Множество полета на Oracle в Select IN Parameter

  3. Извличане на типа таблица на Oracle от съхранената процедура с помощта на JDBC

  4. Сумиране на търсения в SSRS

  5. Oracle:как да добавя минути към времева марка?