
Raporty AWR w bazach Oracle
Raporty AWR (Automatic Workload Repository) to narzędzie diagnostyczne dostępne w bazach danych Oracle, które pomaga analizować wydajność systemu i identyfikować obszary wymagające optymalizacji. Na pierwszy rzut oka wyglądają, umówmy się, dość zawile. Sporo sekcji, mnóstwo liczb i parametrów. Z powodu swojej szczegółowej i technicznej natury wymagają pewnej wprawy w użytkowaniu. Po głębszej analizie okazuje się jednak, że jest to niezwykle wartościowe narzędzie dla administratorów baz i fakt, że umożliwia sięgnięcie do archiwalnych stanów bazy (standardowo do 8 dni wstecz) czyni go jeszcze bardziej użytecznym.
Utrzymanie minimum ośmiodniowej retencji jest bardzo przemyślaną strategią, ponieważ daje wgląd do analogicznego okresu sprzed tygodnia. Innymi słowy, jeśli dziś wystąpił problem z wydajnością, warto sprawdzić, czy podobne zdarzenie wystąpiło tydzień temu. Być może problem ma charakter cykliczny i związany jest np. z automatycznym uruchamianiem zadań. Jeśli uważasz, że mimo wszystko okres ten jest zbyt krótki, zwiększ go przy użyciu poniższej procedury, pamiętając o zarezerwowaniu większej przestrzeni w tablespace SYSAUX:
exec dbms_workload_repository.modify_snapshot_settings(interval=>15*60,retention=>30*24*60);
W tym przykładzie okres przechowywania określono na 30 dni (43200 min), a odstęp między każdą migawką wynosi 60 min.
Jako, że przy tworzeniu raportu wykorzystywane są widoki Active Session History, wymagane jest posiadanie licencji Diagnostic Pack. Jeśli jej nie posiadasz, pozostaje Ci użycie pakietu Statspack, który nie dostarcza niestety takiej automatyki jak raporty AWR.
Generowanie raportu
Aby wygenerować raport należy uruchomić skrypt awrrpt.sql znajdujący się w katalogu $ORACLE_HOME/rdbms/admin
cd $ORACLE_HOME/rdbms/admin
sqlplus / as sysdba
SQL> @awrrpt.sql
Po uruchomieniu zdecyduj, czy preferujesz wynik w formie tekstu czy struktury HTML, oraz wskaż zakres migawek jaki będziesz chciał analizować (przedział czasu).
Enter value for num_days: 1
Listing the last day's Completed Snapshots
Instance DB Name Snap Id Snap Started Snap Level
------------ ------------ ---------- ------------------ ----------
cdblab01 CDBDBLAB01 18330 20 Sep 2023 00:00 1
18331 20 Sep 2023 01:00 1
18332 20 Sep 2023 02:00 1
18333 20 Sep 2023 03:00 1
18334 20 Sep 2023 04:00 1
18335 20 Sep 2023 05:00 1
18336 20 Sep 2023 06:00 1
18337 20 Sep 2023 07:00 1
[...]
Specify the Begin and End Snapshot Ids
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Enter value for begin_snap: 18336
Begin Snapshot Id specified: 18336
Enter value for end_snap: 18337
End Snapshot Id specified: 18337
Po zakończeniu pobierania danych, raport zostanie wyświetlony na ekranie. Pierwsza sekcja zawiera informacje dotyczące nazwy bazy, hosta oraz opcjonalnie kontenerów PDB zawartych w bazie.
DB Name DB Id Unique Name DB Role Edition Release RAC CDB
------------ ----------- ----------- ---------------- ------- ---------- --- ---
CDBDBLAB01 3446739 cdblab01 PRIMARY EE 19.0.0.0.0 NO YES
Instance Inst Num Startup Time User Name System Data Visible
------------ -------- --------------- ------------ --------------------
cdblab01 1 24-Jun-23 18:04 SYS YES
Container DB Id Container Name Open Time
--------------- --------------- ---------------
79466073 PDB$SEED 24-Jun-23 18:04
544672419 CDB$ROOT 24-Jun-23 18:04
3580336812 PDBLABDB 24-Jun-23 18:04
Host Name Platform CPUs Cores Sockets Memory(GB)
---------------- -------------------------------- ---- ----- ------- ----------
Aixlab100 AIX-Based Systems (64-bit) 64 8 216.00
W kolejnej, możemy zapoznać się z czasami wykonania analizowanych migawek, liczbie sesji oraz średniej liczbie kursorów w sesjach:
Snap Id Snap Time Sessions Curs/Sess PDBs
--------- ------------------- -------- --------- -----
Begin Snap: 18336 20-Sep-23 06:00:45 361 5.4 3
End Snap: 18337 20-Sep-23 07:00:51 330 5.2 3
Elapsed: 60.10 (mins)
DB Time: 1,106.98 (mins)
W tym momencie zwróć proszę uwagę na wartość metryki DB Time. Jest to statystyka, która jest sumą czasu zużytego na działanie wszystkich procesów bazy Oracle oraz sumą czasów oczekiwania.
Już na tym etapie możemy wyciągnąć pewnie wnioski. Porównując przedział czasu jaki upłynął pomiędzy wykonanymi migawkami (elapsed time), z wartością DB Time, opisującą aktywność bazy, możemy stwierdzić, że jeżeli wartość DB Time jest znacznie większa od wartości elepsed time, niektóre sesje oczekiwały na zwolnienie zasobów.
W tym przypadku pomimo, iż analizujemy przedział 60 minut, wartość DB Time wykazuje ponad 1000 minut. Może to oznaczać, że analizowana baza była w tym czasie zajęta lub nawet przeciążona.
Kolejną sekcją dającą ogólny pogląd na temat wydajności, jest Instance Efficiency Percentages (Procentowa wydajności instancji). Zawiera ona tzw. „współczynniki trafień”, jak również procentową wartość proporcji zapytań wykonanych do przeanalizowanych (Execute to Parse). Jak można się przekonać z sugestii (Target 100%), idealną wartością docelową parametrów jest 100%.
Sekcja ta pokazuje, że prawie 99% analiz ma charakter miękki, na co wskazuje metryka Soft Parse %. To bardzo dobry wynik, który mówi, że baza Oracle wykorzystuje ponownie przygotowane wcześniej plany zapytań SQL. Ogólna zasada polega na tym, że zawsze należy minimalizować liczbę twardych analiz w produkcyjnej bazie danych. Ta redukcja zapewnia korzyść w postaci minimalizacji obciążenia procesora podczas wykonywania kosztownych analiz.
Następną interesującą metryką jest Parse CPU to Parse Elapsd (stosunek czasu analizy składni do czasu procesora). W tym przypadku jest to około 22%. Fakt ten pokazuje, że baza czekała na pewne zasoby podczas analizowania instrukcji SQL. Z doświadczenia wiem, że akurat ta wartość często przyjmuje małe wartości. W tym wypadku nie oznacza to znaczących nieprawidłowości.
Instance Efficiency Percentages (Target 100%)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Buffer Nowait %: 99.99 Redo NoWait %: 100.00
Buffer Hit %: 97.67 In-memory Sort %: 100.00
Library Hit %: 99.73 Soft Parse %: 98.76
Execute to Parse %: 91.18 Latch Hit %: 99.87
Parse CPU to Parse Elapsd %: 22.18 % Non-Parse CPU: 99.62
Flash Cache Hit %: 0.00
Przejdźmy do kolejnej sekcji raportu a mianowicie Top 10 Foreground Events (10 pierwszoplanowych zdarzeń). Zawiera ona informacje o obszarach, w których zajętych było najwięcej zasobów.
Poniższy przykład ilustruje, że najwięcej zasobów było wykorzystanych podczas przeszukiwania indeksów db file sequential read. W obciążonym systemie obsługującym dużą liczbę transakcji (takim jak ten) wysoka wartość tej metryki jest sytuacją normalną, ale już np. duże wartości w SQL*Net message from dblink mogą świadczyć, że baza przeszukiwała dane dostępne w zewnętrznych zasobach i najprawdopodobniej napotkała problem z wydajnością sieci.
Top 10 Foreground Events by Total Wait Time
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Total Wait Avg % DB Wait
Event Waits Time (sec) Wait time Class
------------------------------ ----------- ---------- --------- ------ --------
DB CPU 11.4K 17.2
db file sequential read 10,769,892 6999.4 649.90us 10.5 User I/O
direct path read 1,126,591 5149.2 4.57ms 7.8 User I/O
db file scattered read 1,148,518 3498 3.05ms 5.3 User I/O
direct path read temp 2,463,087 2757.3 1.12ms 4.2 User I/O
SQL*Net message from dblink 494,308 2334.2 4.72ms 3.5 Network
SQL*Net more data from dblink 2,023,625 2037.2 1.01ms 3.1 Network
direct path write temp 930,859 1428.7 1.53ms 2.2 User I/O
latch free 1,974,192 1083.2 548.67us 1.6 Other
control file sequential read 1,753,380 707 403.20us 1.1 System I
Profil obciążenia bazy (Load Profile)
Ta sekcja dostarcza szczegółowych danych na temat rodzajów operacji bazodanowych jakie były wykonywane, oraz ile zasobów zużyły. Istotne są w tu częstotliwości wykonywanych operacji wejścia-wyjścia (Physical reads / writes) oraz twardych analiz składni zapytań (Hard parses). Jeśli zauważysz duże wartości w sekcji hard parses, może to oznaczać, że zapytania nie wykorzystują zmiennych bindowanych. W przypadku tego typu problemów z systemami produkcyjnymi, powinieneś fakt ten zgłosić do zespołu projektowego.
Tu należy się szersze wyjaśnienie , czym są zmienne bindowane?
Ilustruje to poniższy przykład. Przypuśćmy, że uruchomimy następujące cztery zapytania:
SELECT * FROM EMPLOYEES WHERE EMPLOYEE_ID=10;
SELECT * FROM EMPLOYEES WHERE EMPLOYEE_ID=15;
SELECT * FROM EMPLOYEES WHERE EMPLOYEE_ID=19;
SELECT * FROM EMPLOYEES WHERE EMPLOYEE_ID=20;
Baza danych opracuje osobny plan dla każdego z zapytań. Taka sytuacja nie jest optymalna z punktu widzenia wydajności, dlatego aby się przed tym uchronić powinniśmy użyć wspomnianych wcześniej zmiennych bindowanych.
Utwórzmy taką zmienną:
variable x number;
i przypiszmy do niej wartość:
begin
:x:=10;
end;
Teraz możemy odwołać się do tej zmiennej w zapytaniach używając składni:
SELECT * FROM EMPLOYEES WHERE EMPLOYEE_ID=:X;
Możemy odpytywać bazę wielokrotnie używając powyższego zapytania, za każdym razem podając inną wartość zmiennej. Z punktu widzenia optymalizatora, będzie to wciąż to samo zapytanie. W uproszczeniu mówiąc, optymalizator kosztowy wykorzysta ten sam plan wykonania, niezależnie od wartości zmiennej bindowanej. Zgłębiając temat bardziej okazuje się, że przygotowany zostanie zestaw kilku planów, ale mechanizm ten szerzej opisałem w oddzielnym artykule: Adaptive Cursor Sharing.
Wracając jednak do dalszej analizy raportów AWR: Jeżeli analizując sekcję „Load Profile”, stwierdzisz wysoką częstotliwość logowań (User Logons), może oznaczać, że aplikacja za każdym razem tworzy nowe połączenie, czyli wykonuje zapytanie i rozłącza sesję. Taka sytuacja, wykonana z wielu jednocześnie uruchomionych klientów może potencjalnie wpłynąć na obciążenie systemu bazodanowego.
Load Profile Per Second Per Transaction Per Exec Per Call
~~~~~~~~~~~~~~~ --------------- --------------- --------- ---------
DB Time(s): 18.4 0.9 0.01 0.03
DB CPU(s): 3.2 0.2 0.00 0.01
Background CPU(s): 0.1 0.0 0.00 0.00
Redo size (bytes): 9,658,868.4 445,126.1
Logical read (blocks): 971,544.6 44,773.4
Block changes: 1,680.4 77.4
Physical read (blocks): 178,511.2 8,226.6
Physical write (blocks): 14,240.7 656.3
Read IO requests: 7,355.6 339.0
Write IO requests: 1,348.7 62.2
Read IO (MB): 2,789.2 128.5
Write IO (MB): 222.5 10.3
IM scan rows: 0.0 0.0
Session Logical Read IM: 0.0 0.0
User calls: 594.7 27.4
Parses (SQL): 178.8 8.2
Hard parses (SQL): 2.2 0.1
SQL Work Area (MB): 58.9 2.7
Logons: 7.7 0.4
User logons: 7.1 0.3
Executes (SQL): 2,026.5 93.4
Rollbacks: 8.4 0.4
Transactions: 21.7
Kolejna sekcja warta uwagi to Top 10 Foreground Events by Total Wait Time. Zawiera ona informacje o zdarzeniach odpowiedzialnych za najdłuższe oczekiwania.
Top 10 Foreground Events by Total Wait Time
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Total Wait Avg % DB Wait
Event Waits Time (sec) Wait time Class
------------------------------ ----------- ---------- --------- ------ --------
DB CPU 11.4K 17.2
db file sequential read 10,769,892 6999.4 649.90us 10.5 User I/O
direct path read 1,126,591 5149.2 4.57ms 7.8 User I/O
db file scattered read 1,148,518 3498 3.05ms 5.3 User I/O
direct path read temp 2,463,087 2757.3 1.12ms 4.2 User I/O
SQL*Net message from dblink 494,308 2334.2 4.72ms 3.5 Network
SQL*Net more data from dblink 2,023,625 2037.2 1.01ms 3.1 Network
direct path write temp 930,859 1428.7 1.53ms 2.2 User I/O
latch free 1,974,192 1083.2 548.67us 1.6 Other
control file sequential read 1,753,380 707 403.20us 1.1 System I
Ta część raportu wskazuje potencjalne źródło problemów z bazą, przy czym już zazwyczaj dwie pierwsze pozycje są odpowiedzialne za większość kłopotów wydajnościowych.
W przypadku prawidłowo działającej bazy, na początku listy powinny znajdować się zdarzenia związane z procesorem i dyskami, jak w naszym przypadku. Jeżeli jednak znajdą się tam zdarzenia z klasy enq: TX – row lock contention lub latch free, zazwyczaj będą one oznaczać rywalizację o zasoby.
Time Model Statistics (Statystyki modelu czasu)
Statystyki modelu czasu dają wgląd w to, gdzie faktycznie spędzany jest czas przetwarzania w interwale migawki. Jeżeli czas twardej analizy (hard parse elapsed time) jest bardzo długi, musisz dokładniej zbadać ten problem.
Time Model Statistics DB/Inst: CDBDBLAB01/cdblab01 Snaps: 18336-18337
-> DB Time represents total time in user calls
-> DB CPU represents CPU time of foreground processes
-> Total CPU Time represents foreground and background processes
-> Statistics including the word "background" measure background process
time, therefore do not contribute to the DB time statistic
-> Ordered by % of DB time in descending order, followed by Statistic Name
% of % of Total
Statistic Name Time (s) DB Time CPU Time
------------------------------------------ ------------------ ------- ----------
sql execute elapsed time 65,734.7 99.0
DB CPU 11,415.6 17.2 97.6
PL/SQL execution elapsed time 1,165.2 1.8
inbound PL/SQL rpc elapsed time 482.5 .7
connection management call elapsed time 372.9 .6
parse time elapsed 192.3 .3
hard parse elapsed time 121.9 .2
RMAN cpu time (backup/restore) 33.6 .1 .3
hard parse (sharing criteria) elapsed time 11.9 .0
PL/SQL compilation elapsed time 1.9 .0
repeated bind elapsed time 1.8 .0
sequence load elapsed time 0.8 .0
failed parse elapsed time 0.5 .0
hard parse (bind mismatch) elapsed time 0.4 .0
DB time 66,418.6
background elapsed time 2,429.7
background cpu time 280.0 2.4
total CPU time 11,695.6
------------------------------------------------------
Najdłużej wykonywane zapytania SQL (Top SQL Statements)
Ta sekcja raportu zawiera listę najdłużej wykonywanych instrukcji SQL. Można tu wychwycić konkretne zapytania sprawiające problem i posługując się ich numerem ID przejść do analizy ich planów.
Top SQL with Top Events DB/Inst: CDBDBLAB01/cdblab01 Snaps: 18336-18337
-> Top SQL statements by DB Time along with the top events by DB Time for
those SQLs.
-> % Activity is the percentage of DB Time due to the SQL.
-> % Event is the percentage of DB Time due to the event that the SQL is
waiting on.
-> % Row Source is the percentage of DB Time due to the row source for the
SQL waiting on the event.
-> Executions is the number of executions of the SQL that were sampled in
ASH.
SQL ID Plan Hash Executions % Activity
----------------------- -------------------- -------------------- --------------
% Row
Event % Event Top Row Source Source
------------------------------ ------- --------------------------------- -------
Container Name
-------------------------------------------
22drvv11nb5r6 5125497296 1 4.95
CPU + Wait for CPU 4.93 HASH - GROUP BY 2.66
select t.numer nr ,a.numer ponu ,case when o.punu i
then case when b.NUMER_KL in (select * from d
PDBLABDB
2685axh6avbvc 758157989 1 4.95
CPU + Wait for CPU 3.73 HASH - GROUP BY 1.33
create table TBL_INMP TABLESPACE USERS_A as select
source, id, od_d, dt_zg, paczka,
Artykuł nie wyczerpuje pełnych możliwości jakie płyną z analizy raportów AWR. Może być za to wstępem w poszukiwaniach problematycznych obszarów w działaniu systemów bazodanowych.
Pomimo, iż raporty AWR mogą początkowo wydawać się zawiłe, stanowią niezastąpione narzędzie administratorów baz, pomagając im utrzymywać środowisko w doskonałej kondycji i minimalizować ryzyko problemów wydajnościowych.