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

Zrozumienie wyników Execute Explain Plan w Oracle SQL Developer

Dane wyjściowe EXPLAIN PLAN są danymi wyjściowymi debugowania optymalizatora zapytań Oracle. COST jest końcowym wynikiem działania optymalizatora opartego na kosztach (CBO), którego celem jest wybranie, który z wielu różnych możliwych planów powinien zostać użyty do uruchomienia zapytania. CBO oblicza względny koszt dla każdego planu, a następnie wybiera plan o najniższym koszcie.

(Uwaga:w niektórych przypadkach CBO nie ma wystarczająco dużo czasu, aby ocenić każdy możliwy plan; w takich przypadkach wybiera po prostu plan o najniższym dotychczas stwierdzonym koszcie)

Ogólnie rzecz biorąc, jednym z największych czynników przyczyniających się do powolnego zapytania jest liczba wierszy odczytanych w celu obsługi zapytania (a dokładniej mówiąc, blokowania), więc koszt będzie oparty częściowo liczby wierszy, które należy odczytać z oszacowań optymalizatora.

Załóżmy na przykład, że masz następujące zapytanie:

SELECT emp_id FROM employees WHERE months_of_service = 6;

(months_of_service kolumna ma ograniczenie NOT NULL i zwykły indeks.)

Optymalizator może wybrać tutaj dwa podstawowe plany:

  • Plan 1:Odczytaj wszystkie wiersze z tabeli „pracownicy”, dla każdego sprawdź, czy predykat jest prawdziwy (months_of_service=6 ).
  • Plan 2:Przeczytaj indeks, gdzie months_of_service=6 (powoduje to zestaw ROWID), a następnie uzyskaj dostęp do tabeli na podstawie zwróconych ROWID.

Wyobraźmy sobie, że tabela „pracownicy” ma 1 000 000 (1 milion) wierszy. Wyobraźmy sobie dalej, że wartości dla months_of_service mieszczą się w zakresie od 1 do 12 i z jakiegoś powodu są dość równomiernie rozłożone.

Koszt Planu 1 , który obejmuje PEŁNE SKANOWANIE, będzie kosztem odczytania wszystkich wierszy w tabeli pracowników, co w przybliżeniu wyniesie 1 000 000; ale ponieważ Oracle często będzie w stanie odczytać bloki za pomocą odczytów wieloblokowych, rzeczywisty koszt będzie niższy (w zależności od konfiguracji bazy danych) - np. wyobraźmy sobie, że liczba odczytów wieloblokowych wynosi 10 - obliczony koszt pełnego skanowania wyniesie 1 000 000 / 10; Koszt całkowity =100 000.

Koszt Planu 2 , który obejmuje SKANOWANIE ZAKRESU INDEKSU i wyszukiwanie tabeli według ROWID, będzie kosztem skanowania indeksu plus koszt dostępu do tabeli według ROWID. Nie będę zagłębiać się w koszt skanowania zakresu indeksu, ale wyobraźmy sobie, że koszt skanowania zakresu indeksu wynosi 1 na wiersz; spodziewamy się znaleźć dopasowanie w 1 na 12 przypadków, więc koszt skanowania indeksu wynosi 1 000 000 / 12 =83 333; plus koszt dostępu do tabeli (załóżmy, że 1 blok odczytu na dostęp, nie możemy tutaj użyć odczytów wieloblokowych) =83 333; Całkowity koszt =166 666.

Jak widać, koszt Planu 1 (pełne skanowanie) jest MNIEJSZY niż koszt Planu 2 (skan indeksu + dostęp przez wierszid) - co oznacza, że ​​CBO wybrałoby pełne skanowanie.

Jeśli założenia przyjęte przez optymalizatora są prawdziwe, to w rzeczywistości Plan 1 będzie lepszy i znacznie bardziej wydajny niż Plan 2 – co obala mit, że PEŁNE skany są „zawsze złe”.

Wyniki byłyby zupełnie inne, gdyby celem optymalizatora było FIRST_ROWS(n) zamiast ALL_ROWS – w takim przypadku optymalizator preferowałby Plan 2, ponieważ często zwraca on pierwsze kilka wierszy szybciej, kosztem mniejszej wydajności całego zapytania .



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. usuwanie milisekund z pola Oracle tmstmp

  2. Jak mogę zobaczyć zapytania, które są wykonywane w Oracle?

  3. Przykład klauzuli WHEN wyzwalacza Oracle

  4. Funkcja rang w MySQL z klauzulą ​​Order By

  5. Utwórz arkusz kalkulacyjny Excel z bazy danych Oracle