Zestawy serwerów równoległych: PARALLEL_DEGREE_LIMIT ogranicza stopień równoległości, ale jeśli twoje zapytanie sortuje lub grupuje, liczba równoległych procesów może być dwa razy większa (dwa zestawy serwerów, aby umożliwić równoległość między procesami). To wyjaśnia, dlaczego zobaczysz 48 równoległych procesów, nawet z limitem 24. Zdarza się to również, jeśli używasz menedżera zasobów, aby ograniczyć DOP.
Wskazówki dotyczące równoległości: PARALLEL_DEGREE_LIMIT dotyczy tylko instrukcji, które używają automatycznego stopnia równoległości. Wszelkie instrukcje, które wykorzystują zakodowany stopień lub nawet dowolny typ równoległej wskazówki na poziomie obiektu, zignorują limit. Jeśli masz te wskazówki, może to wyjaśniać, dlaczego czasami widzisz 96.
Kalibruj IO: Być może automatyczny DOP nie jest używany, a zatem limit nie jest przestrzegany, ponieważ IO nie zostało skalibrowane . To zapytanie powie ci, czy IO zostało skalibrowane:
select * from V$IO_CALIBRATION_STATUS;
Widziałem już to powodujące problemy, ale mój obecny system nie jest skalibrowany i wydaje się, że automatyczny DOP działa dobrze. Możesz stwierdzić, czy to naprawdę problem, patrząc na sekcję Notatki w planie wyjaśniania. Jeśli widzisz coś w - automatic DOP: Computed Degree of Parallelism is 2
porządku, ale nie chcesz tego widzieć automatic DOP: skipped because of IO calibrate statistics are missing
.
Zwiększ PARALLEL_MAX_SERVERS: Zamiast martwić się brakiem serwerów równoległych, zalecam znaczne zwiększenie PARALLEL_MAX_SERVERS. Powinieneś przynajmniej spróbować wrócić do wartości domyślnej PARALLEL_THREADS_PER_CPU x CPU_COUNT x concurrent_parallel_users x 5, między 240 a 960, w zależności od ustawień pamięci.
Te wysokie liczby brzmią absurdalnie dla wielu DBA, ale w rzeczywistości mają sens z następujących powodów:
- Serwery równoległe Oracle są lżejsze niż większość ludzi zakłada. (I mało kto go testuje, po prostu znajduje jedną sytuację, w której duży DOP powoduje problem i zakłada, że wysoki DOP jest zawsze zły).
- Często uruchamia się zapytanie adhoc w narzędziu GUI, które pobiera tylko pierwsze 50 wierszy, ale nadal korzysta z dziesiątek równoległych serwerów. Te zapytania NIE zużywają znaczących zasobów, chyba że PARALLEL_MAX_SERVERS jest zbyt niski. Wtedy ludzie są wyzywani za uruchamianie całkowicie rozsądnych zapytań, które mogą prowadzić do brzydkich sytuacji.
- Bardzo duży DOP dla pojedynczego zapytania nie zawsze jest zły. Wszyscy zakładają, że jeśli będziesz dalej zwiększać DOP, narzut będzie zbyt wysoki, a wydajność znacznie spadnie. Ale w wielu systemach zauważyłem, że nawet absurdalnie wysoki DOP doprowadzi do lepszej wydajności, chociaż zdecydowanie spadają zyski i może być bardzo niesprawiedliwe w stosunku do innych sesji. Ale nie zgaduj, przetestuj; weź zapytanie i uruchom je z wszystkimi rodzajami DOP, nawet do 1000. Możesz być zaskoczony.
- Tak, zbyt duża równoległość może być zła. Ale co gorsza dla systemu, mając nieco więcej niż optymalną liczbę sesji lub zmuszając zapytanie do szeregowania i w zasadzie zabijając ważną pracę? Powinieneś monitorować system przed wprowadzeniem arbitralnych limitów.