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

Jak wykorzystać plan wyjaśniania do optymalizacji zapytań?

Zakładam również, że używasz Oracle. Na początek polecam również zapoznanie się ze stroną internetową planu wyjaśnień. Optymalizacja jest dużo, ale można się jej nauczyć.

Oto kilka wskazówek:

Po pierwsze, gdy ktoś zleca Ci optymalizację, prawie zawsze szuka akceptowalnej wydajności, a nie najwyższej wydajności. Jeśli możesz skrócić czas działania zapytania z 3 minut do 3 sekund, nie przejmuj się skracaniem go do 2 sekund, dopóki nie zostaniesz o to poproszony.

Po drugie, wykonaj szybkie sprawdzenie, aby upewnić się, że optymalizowane zapytania są logicznie poprawne. Brzmi to absurdalnie, ale nie mogę powiedzieć, ile razy proszono mnie o poradę w sprawie wolno działającego zapytania, tylko po to, by dowiedzieć się, że od czasu do czasu podawał złe odpowiedzi! Jak się okazuje, debugowanie zapytania często okazywało się również przyspieszać jego działanie.

W szczególności poszukaj wyrażenia „Dołączanie kartezjańskie” w planie wyjaśniania. Jeśli to tam zobaczysz, są bardzo duże szanse, że znalazłeś niezamierzone sprzężenie kartezjańskie. Typowym wzorcem niezamierzonego złączenia kartezjańskiego jest to, że klauzula FROM wymienia tabele oddzielone przecinkami, a warunki złączenia znajdują się w klauzuli WHERE. Tyle że brakuje jednego z warunków złączenia, więc Oracle nie ma innego wyjścia, jak wykonać złącze kartezjańskie. Przy dużych stołach jest to katastrofa wydajności.

W planie wyjaśniania można zobaczyć sprzężenie kartezjańskie, w którym zapytanie jest logicznie poprawne, ale kojarzę to ze starszymi wersjami Oracle.

Poszukaj także nieużywanego indeksu złożonego. Jeśli pierwsza kolumna indeksu złożonego nie jest używana w zapytaniu, Oracle może użyć indeksu nieefektywnie lub wcale. Podam przykład:

Zapytanie brzmiało:

select * from customers    
where
     State = @State
     and ZipCode = @ZipCode

(DBMS nie był Oracle, więc składnia była inna i zapomniałem oryginalnej składni).

Szybki rzut oka na indeksy ujawnił indeks klientów z kolumnami (Kraj, Stan, Kod pocztowy) w tej kolejności. Zmieniłem zapytanie na przeczytane

  select * from customers
   where Country = @Country
      and State = @State
      and ZipCode = @ZipCode

a teraz działał w około 6 sekund zamiast około 6 minut, ponieważ optymalizator był w stanie wykorzystać indeks z dobrą korzyścią. Zapytałem programistów aplikacji, dlaczego pominęli kraj w kryteriach i to była ich odpowiedź:wiedzieli, że wszystkie adresy mają kraj równy 'USA', więc uznali, że mogą przyspieszyć zapytanie, pomijając to kryterium!

Niestety, optymalizacja pobierania z bazy danych to nie to samo, co skrócenie czasu obliczeniowego o mikrosekundy. Obejmuje to zrozumienie projektu bazy danych, zwłaszcza indeksów, oraz przynajmniej omówienie sposobu, w jaki optymalizator wykonuje swoją pracę.

Zwykle uzyskujesz lepsze wyniki dzięki optymalizatorowi, gdy uczysz się z nim współpracować, zamiast próbować go przechytrzyć.

Powodzenia w szybkiej optymalizacji!



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Zaktualizuj zapytanie if dla Oracle

  2. Indeksy baz danych B-Tree vs Bitmap

  3. PLS-00221:„C1” (kursor) nie jest procedurą lub jest niezdefiniowany

  4. Przekaż wartość przechowywaną w zmiennej PL/SQL do klauzuli IN

  5. Funkcja NLS_LOWER() w Oracle