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

Dlaczego Oracle używa DBMS_STATS.GATHER_TABLE_STATS?

Większość korporacyjnych baz danych, w tym Oracle, korzysta z optymalizatora opartego na kosztach, aby określić odpowiedni plan zapytania dla danej instrukcji SQL. Oznacza to, że optymalizator wykorzystuje informacje o danych do określenia sposobu wykonania zapytania, zamiast polegać na regułach (tak właśnie zrobił starszy optymalizator oparty na regułach).

Na przykład wyobraź sobie tabelę dla prostej aplikacji do śledzenia błędów

CREATE TABLE issues (
  issue_id number primary key,
  issue_text clob,
  issue_status varchar2(10)
);

CREATE INDEX idx_issue_status
    ON issues( issue_status );

Jeśli prowadzę dużą firmę, w tej tabeli może znajdować się milion wierszy. Spośród nich 100 ma issue_status z AKTYWNYCH, 10 000 ma issue_status W KOLEJCE, a 989 900 ma status UKOŃCZONE. Jeśli chcę uruchomić zapytanie w tabeli, aby znaleźć moje aktywne problemy

SELECT *
  FROM issues
 WHERE issue_status = 'ACTIVE'

optymalizator ma wybór. Może użyć indeksu w issue_status a następnie wykonaj wyszukiwanie pojedynczego wiersza w tabeli dla każdego wiersza w indeksie, który pasuje lub może wykonać skanowanie tabeli dla issues stół. Który plan jest bardziej wydajny, będzie zależeć od danych zawartych w tabeli. Jeśli Oracle oczekuje, że zapytanie zwróci niewielką część danych w tabeli, użycie indeksu byłoby bardziej wydajne. Jeśli Oracle oczekuje, że zapytanie zwróci znaczną część danych w tabeli, skanowanie tabeli byłoby bardziej wydajne.

DBMS_STATS.GATHER_TABLE_STATS jest tym, co gromadzi statystyki, które pozwalają firmie Oracle dokonać tej oceny. Mówi Oracle, że w tabeli jest około 1 miliona wierszy, że istnieją 3 różne wartości dla issue_status kolumna i że dane są nierównomiernie rozłożone. Tak więc Oracle wie, że użyć indeksu do zapytania, aby znaleźć wszystkie aktywne problemy. Ale wie też o tym, gdy się odwrócisz i spróbujesz poszukać wszystkich zamkniętych problemów

SELECT *
  FROM issues
 WHERE issue_status = 'CLOSED'

że bardziej wydajne będzie skanowanie tabeli.

Zbieranie statystyk umożliwia zmianę planów zapytań w czasie wraz ze zmianą ilości danych i dystrybucji danych. Gdy po raz pierwszy zainstalujesz narzędzie do śledzenia problemów, będziesz mieć bardzo mało ZAKOŃCZONYCH problemów i więcej problemów AKTYWNYCH i W KOLEJCE. Z biegiem czasu liczba ZAKOŃCZONYCH spraw rośnie znacznie szybciej. W miarę pojawiania się większej liczby wierszy w tabeli i zmiany względnej części wierszy o różnych statusach, plany zapytań ulegną zmianie, dzięki czemu w idealnym świecie zawsze otrzymasz najbardziej wydajny plan.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Nieprawidłowy identyfikator SQL

  2. Jak dostroić lub przetestować wydajność kodu PLSQL w Oracle D2k Forms

  3. Ponieważ SQL Server nie zawiera pakietów, co robią programiści, aby go obejść?

  4. Wybierz z tabeli, znając tylko datę bez czasu (ORACLE)

  5. Sesja nieaktywna w Oracle przez JDBC