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

Zapytanie Oracle używające 'like' na indeksowanej kolumnie liczb, słaba wydajność

warunek dopasowania wzorca LIKE oczekuje, że typy znaków będą widziane zarówno jako operandy lewostronne, jak i prawostronne. Gdy napotka NUMBER, niejawnie konwertuje go na znak. Twoje zapytanie 1 jest w zasadzie po cichu przepisane na to:

SELECT a1.*
  FROM people a1
 WHERE TO_CHAR(a1.id) LIKE '119%'
   AND ROWNUM < 5

Tak dzieje się w twoim przypadku, a to jest złe z dwóch powodów:

  1. Konwersja jest wykonywana dla każdego wiersza, co jest powolne;
  2. Ze względu na funkcję (choć niejawną) w predykacie WHERE, Oracle nie może użyć indeksu A1.ID kolumna.

Aby to obejść, musisz wykonać jedną z następujących czynności:

  1. Utwórz indeks oparty na funkcjach na A1.ID kolumna:

    CREATE INDEX people_idx5 ON people (TO_CHAR(id));

  2. Jeśli chcesz dopasować rekordy w pierwszych 3 znakach kolumny ID, utwórz kolejną kolumnę typu NUMBER zawierającą tylko te 3 znaki i użyj zwykłego = operator na nim.

  3. Utwórz oddzielny kolumna ID_CHAR typu VARCHAR2 i wypełnij go TO_CHAR(id) . Indeksuj go i używaj zamiast ID w swoim WHERE stan.

    Oczywiście, jeśli zdecydujesz się utworzyć dodatkową kolumnę w oparciu o istniejącą kolumnę ID, musisz zachować te 2 zsynchronizowane. Możesz to zrobić wsadowo jako pojedynczą aktualizację lub w wyzwalaczu ON-UPDATE lub dodać tę kolumnę do odpowiedniej Instrukcje INSERT i UPDATE w kodzie.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak mogę wygenerować (lub pobrać) skrypt ddl na istniejącej tabeli w Oracle? Muszę je odtworzyć w Hive

  2. Jak wykonać blok PL SQL w Oracle

  3. Oracle:unikatowość selektywna indeksu na podstawie funkcji

  4. Co to są widoki zmaterializowane?

  5. Błąd we/wy:przekroczono limit czasu odczytu gniazda. Jakie są powody?