Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Indeks nie jest używany z powodu konwersji typu?

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:



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Wstaw zbiór danych do tabeli Oracle

  2. Odmowa dostępu podczas ustawiania DBMS_XDB.SETHTTPORT

  3. Zapytanie SQL, aby uzyskać odrębne wartości wszystkich wartości kolumn w tabeli

  4. Jak porównać dwa obiekty bazy danych w Oracle?

  5. Nie można utworzyć wystąpienia błędu dostawcy OLE DB jako użytkownik uwierzytelniania systemu Windows