porady Oracle Burleson Consulting |
w ramach tych dwóch optymalizatorów Oracle udostępnia kilka trybów optymalizacji. Tryb optymalizatora może być ustawiony dla całej bazy danych lub może być ustawiony dla konkretnej sesji Oracle. Tryby optymalizatora obejmują rule, first_rows, all_rows I choose. Przyjrzyjmy się bliżej każdemu z tych celów.
tryb reguły
wskazówka reguły zignoruje CBO i statystyki i wygeneruje plan wykonania oparty wyłącznie na podstawowych informacjach słownika danych. Zawsze dobrym pomysłem jest próba dostrojenia konkretnej instrukcji SQL za pomocą RBO za pomocą podpowiedzi reguły lub poprzez wydanie reguły Alter session set optimizer_goal=. Należy jednak zawsze pamiętać, że RBO może wybrać indeks mniej niż idealny do obsługi zapytania.
Optimizer_mode=choose
tryb wyboru optymalizatora pozwala firmie Oracle wybrać najbardziej odpowiedni cel optymalizacji. Jest to domyślny tryb optymalizatora w Oracle i zazwyczaj wykorzystuje obecność statystyk, aby określić, który optymalizator wywołać. Jeśli nie istnieją żadne statystyki, Oracle użyje celu reguły. Jeśli istnieją statystyki, Oracle wybierze first_rows lub all_rows, w zależności od obecności indeksów i ustawienia paralelism i db_file_multiblock_read_count.
Ostrzeżenie: posiadanie niekompletnych statystyk w trybie wyboru optymalizatora może spowodować ogromne spowolnienie. Jeśli Oracle wykryje pojedynczą tabelę w zapytaniu ze statystykami, użyje optymalizatora opartego na kosztach i obliczy statystyki dla innych tabel w czasie wykonywania. Może to spowodować ogromne spowolnienie wykonywania SQL. Ten problem jest bardzo powszechny u początkujących Oracle Remote dba, ponieważ domyślnym trybem jest choose, a ponieważ początkujący zdalni DBAs czasami selektywnie wydają polecenie analyze, nie zdając sobie sprawy, że wpływają one na czasy wykonania SQL.
tryb first_rows
jest to tryb optymalizacji oparty na kosztach, który zwróci wiersze tak szybko, jak to możliwe, nawet jeśli ogólne zapytanie działa dłużej lub zużywa więcej zasobów. Tryb optymalizatora first_rows zwykle polega na wybraniu skanowania pełnego indeksu zamiast równoległego skanowania pełnego tabeli. Ponieważ tryb first_rows faworyzuje skanowanie indeksów zamiast skanowania w pełnej tabeli, tryb first_rows jest najbardziej odpowiedni dla Systemów online, w których użytkownik końcowy chce zobaczyć wyniki tak szybko, jak to możliwe.
tryb all_rows
jest to tryb optymalizacji oparty na kosztach, który zapewnia zminimalizowanie całkowitego czasu zapytania, nawet jeśli odbiór pierwszego wiersza trwa dłużej. Zwykle wiąże się to z wyborem równoległego skanowania pełnej tabeli zamiast skanowania pełnego indeksu. Ponieważ tryb all_rows preferuje skanowanie w pełnej tabeli, tryb all_rows najlepiej nadaje się do zapytań zorientowanych wsadowo, gdzie pośrednie wiersze nie są wymagane do przeglądania.
która jest „lepsza”? Szybka realizacja kontra Minimalne zużycie zasobów.
aby zrozumieć filozofię Oracle dotyczącą szybkiej realizacji i minimalnego zużycia zasobów, musimy spojrzeć na prosty przykład. Aby zilustrować różnicę między all_rows i first_rows za pomocą zbyt uproszczonego przykładu, rozważ następujące zapytanie:
select
last_name
from
customer
order by
last_name;
to zapytanie może być obsługiwane na dwa sposoby:
-
Skanowanie w pełnej tabeli-tutaj wykonujemy skanowanie w pełnej tabeli równolegle i sortujemy wiersze w TEMP tablespace. Dla zilustrowania, Załóżmy, że ten plan wykonania zapewnia najszybszy ogólny czas wykonania i Minimalne zużycie zasobów (Rysunek 2).
Rysunek 2: wykonaj pełne skanowanie tabeli i sortowanie (all_rows)
-
Pełne skanowanie indeksu – tutaj pobieramy wiersze w kolejności last_name za pomocą last_name_index. Ta technika powoduje więcej fizycznych odczytów, ale zaczyna prawie natychmiast zwracać posortowane wiersze(Rysunek 3).
Rysunek 3: Wykonaj wyszukiwanie indeksu (first_rows)
ponownie, zakładając, że akceptujemy skanowanie w pełnej tabeli i sortowanie jest mniej intensywne We/Wy niż skanowanie w pełnym indeksie, wtedy wyraźnie widzimy różnicę w celach optymalizatora. Skanowanie pełnego indeksu zacznie zwracać wiersze niemal natychmiast kosztem dodatkowych we/wy, podczas gdy skanowanie pełnego indeksu będzie wymagało mniej zasobów, ale zestaw wyników nie będzie dostępny do końca zapytania.
jest to fragment „Oracle High-Performance SQL Tuning” autorstwa Donalda K. Burlesona, opublikowany przez Oracle Press.