Najważniejszą rzeczą do zrozumienia w przypadku równoległości Oracle jest to, że jest to skomplikowane. Optymalizacja równoległości wymaga dużej wiedzy na temat Oracle, czytania podręczników, sprawdzania wielu parametrów, testowania długotrwałych zapytań i dużego sceptycyzmu.
Zadawaj właściwe pytania
Problemy równoległe w rzeczywistości obejmują trzy różne pytania:
- Ile serwerów równoległych zostało żądanych?
- Ile serwerów równoległych zostało przydzielonych?
- Ile serwerów równoległych zostało użytych w sensowny sposób?
Użyj najlepszych narzędzi
Przejdź od razu do najlepszego narzędzia — SQL Monitoring z aktywnymi raportami. Znajdź swój identyfikator SQL_ID i wygeneruj raport HTML:select dbms_sqltune.report_sql_monitor(sql_id => 'your_sql_id', type => 'active') from dual;
. Tylko w ten sposób można dowiedzieć się, ile czasu poświęcono na każdy krok w planie realizacji. I powie Ci, ile paralelizmu skutecznie wykorzystano i gdzie. Na przykład:
Inną dobrą opcją jest type => 'text'
. Nie zawiera aż tylu informacji, ale można je szybciej przeglądać i łatwiej się nimi dzielić.
Monitorowanie SQL obejmuje również żądany DOP i przydzielony DOP:
100-wierszowy równoległy select
może działać pięknie, ale potem wszystko zatrzymuje się w jednym kroku z powodu niebuforowanej sekwencji. Możesz godzinami gapić się na plan wyjaśnienia, ślad lub raport AWR i nie widzieć problemu. Aktywny raport sprawia, że powolne kroki są niemal trywialne. Nie trać czasu na zgadywanie, gdzie leży problem.
Jednak nadal potrzebne są inne narzędzia. Plan wyjaśnień wygenerowany za pomocą explain plan for ...
i select * from table(dbms_xplan.display)
; dostarczy kilku kluczowych informacji. W szczególności Notes
sekcja może zawierać wiele powodów, dla których zapytanie nie żądało równoległości.
Ale DLACZEGO mam taką liczbę serwerów równoległych?
Odpowiednie informacje znajdują się w kilku różnych podręcznikach, które są bardzo przydatne, ale czasami są niedokładne lub mylące. Istnieje wiele mitów i wiele złych rad na temat równoległości. A technologia zmienia się znacząco z każdym wydaniem.
Po zebraniu wszystkich renomowanych źródeł lista czynników wpływających na liczbę serwerów równoległych jest zdumiewająco długa. Poniższa lista jest uporządkowana według tego, co moim zdaniem jest najważniejszymi czynnikami:
- Równoległość między operacjami Każde zapytanie używające sortowania lub grupowania przydzieli dwa razy więcej serwerów równoległych niż DOP. Jest to prawdopodobnie odpowiedzialne za mit „Oracle przydziela jak najwięcej serwerów równoległych!”.
- Wskazówka dotycząca zapytania Najlepiej wskazówka na poziomie instrukcji, taka jak
/*+ parallel */
lub ewentualnie wskazówka na poziomie obiektu, taka jak/*+ noparallel(table1) */
. Jeśli określony krok planu działa szeregowo, jest to zwykle spowodowane podpowiedziami na poziomie obiektu tylko w części zapytania. - Rekursywny SQL Niektóre operacje mogą działać równolegle, ale można je skutecznie serializować za pomocą rekurencyjnego kodu SQL. Na przykład niebuforowana sekwencja na dużej wstawce. Rekursywny kod SQL wygenerowany w celu przeanalizowania instrukcji również będzie miał postać szeregową; na przykład dynamiczne zapytania próbkowania.
- Zmień sesję
alter session [force|enable] parallel [query|dml|ddl];
Zauważ, że równoległy DML jest domyślnie wyłączony. - Stopień tabeli
- Stopień indeksu
- Indeks był tańszy Równoległe wskazówki informują optymalizatora, aby rozważył pełne skanowanie tabeli z określonym DOP. W rzeczywistości nie wymuszają równoległości. Optymalizator może nadal korzystać z szeregowego dostępu do indeksu, jeśli uważa, że jest to tańsze. (
FULL
wskazówka może pomóc rozwiązać ten problem.) - Zarządzanie planem Plany bazowe SQL Plan, kontury, profile, zaawansowane przepisywanie i translatory SQL mogą zmieniać stopień równoległości za Twoimi plecami. Sprawdź sekcję Notatki planu.
- Wydanie Tylko wersje Enterprise i Personal umożliwiają wykonywanie operacji równoległych. Z wyjątkiem pakietu DBMS_PARALLEL_EXECUTE.
- PARALLEL_ADAPTIVE_MULTI_USER
- PARALLEL_AUTOMATIC_TUNING
- PARALLEL_DEGREE_LIMIT
- PARALLEL_DEGREE_POLICY
- PARALLEL_FORCE_LOCAL
- PARALLEL_INSTANCE_GROUP
- PARALLEL_IO_CAP_ENABLED
- PARALLEL_MAX_SERVERS To jest górna granica dla całego systemu. Tutaj jest kompromis. Uruchamianie zbyt wielu równoległych serwerów naraz jest szkodliwe dla systemu. Ale obniżenie wersji zapytania do szeregowego może być katastrofalne w przypadku niektórych zapytań.
- PARALLEL_MIN_PERCENT
- PARALLEL_MIN_SERVERS
- PARALLEL_MIN_TIME_THRESHOLD
- PARALLEL_SERVERS_TARGET
- PARALLEL_THREADS_PER_CPU
- Liczba węzłów RAC Kolejny mnożnik dla domyślnego DOP.
- CPU_COUNT Jeśli używany jest domyślny DOP.
- RECOVERY_PARALLELISM
- FAST_START_PARALLEL_ROLLBACK
- Profil
SESSIONS_PER_USER
ogranicza również serwery równoległe. - Menedżer zasobów
- Obciążenie systemu Jeśli parametr Parallel_adaptive_multi_user ma wartość true. Prawdopodobnie niemożliwe do odgadnięcia, kiedy Oracle zacznie dławić.
- PROCESY
- Równoległe ograniczenia DML Równoległy DML nie będzie działał, jeśli którykolwiek z tych przypadków:
- ZGODNE <9.2 dla wewnątrz partycji
- WSTAW WARTOŚCI, tabele z wyzwalaczami
- replikacja
- integralność autoreferencyjna lub usuń kaskadowe lub odroczone ograniczenia integralności
- dostęp do kolumny obiektów
- tabela niepartycjonowana z LOB
- równoległość wewnątrz partycji z LOB
- transakcja rozproszona
- tabele w klastrach
- tabele tymczasowe
- Podzapytania skalarne nie działają równolegle? To jest w instrukcji i chciałbym, żeby tak był prawda, ale moje testy wskazują, że paralelizm działa tutaj w 11g.
- ENQUEUE_RESOURCES Ukryty parametr w 10g, czy to już ma znaczenie?
- Tabele zorganizowane według indeksu Nie można równolegle wstawić ścieżki bezpośredniej do obiektów IOT? (Czy to nadal prawda?)
- Wymagania dotyczące funkcji równoległego przetwarzania potokowego Należy użyć
CURSOR
(?). DO ZROBIENIA. - Funkcje muszą być PARALLEL_ENABLE
- Rodzaj oświadczenia Starsze wersje ograniczały równoległość w DML w zależności od partycjonowania. Niektóre z aktualnych podręczników nadal to zawierają, ale z pewnością nie jest to już prawdą.
- Liczba partycji Tylko dla złączeń partycjonowanych w starszych wersjach.(?)
- Błędy W szczególności widziałem wiele błędów związanych z parsowaniem. Oracle przydzieli odpowiednią liczbę serwerów równoległych, ale nic się nie stanie, ponieważ wszystkie czekają na zdarzenia, takie jak
cursor: pin s wait on x
.
Ta lista z pewnością nie jest kompletna i nie obejmuje funkcji 12c. I nie rozwiązuje problemów z systemem operacyjnym i sprzętem. I nie odpowiada na strasznie trudne pytanie:„jaki jest najlepszy stopień równoległości?” (Krótka odpowiedź:więcej jest zwykle lepiej, ale kosztem innych procesów.) Mam nadzieję, że przynajmniej daje poczucie, jak trudne mogą być te problemy i jest dobrym miejscem do rozpoczęcia poszukiwań.