Strojenie instancji bazy danych Oracle9i Juliusz.Jezierski@cs.put.poznan.pl Kiedy i co stroić? Koszt strojenia w trakcie budowy i eksploatacji systemu informatycznego koszt projekt implementacja eksploatacja Efekt strojenia w trakcie budowy i eksploatacji systemu informatycznego czas efekt czas 1 projekt implementacja eksploatacja 2 Cele strojenia Czas odpowiedzi systemu (aplikacji) Przepustowość Szybkość ładowania danych Czas odtwarzania po awarii Oczekiwania uŝytkowników Kroki strojenia systemu aplikacji Strojenie projektu Strojenie aplikacji Strojenie pamięci Strojenie I/O Strojenie rywalizacji Strojenie systemu operacyjnego 3 4
Statystyki punktu odniesienia Zbierz statystyki podczas pracy systemu gdy parametry jego pracy są satysfakcjonujące Wykorzystaj statystyki punktu odniesienia do porównania ze statystykami zebranymi podczas niewydajnej pracy systemu Sformułuj hipotezę co zmieniło się w systemie Kroki strojenia instancji bazy danych 1. Zdefiniuj problem 2. Zbierz statystyki instancji i systemu operacyjnego 3. RozwaŜ często spotykane przyczyny słabej wydajności 4. Przemyśl moŝliwe działania 5. Przeprowadź zaplanowane działania i zmierz ich skutki 6. Sprawdź czy wąskie gardło zostało usunięte 7. JeŜeli nie to wróć to punktu 1-szego 5 6 Metodyka strojenia instancji bazy danych Sprawdź plik strzeŝeń i pliki śladów instancji Sprawdź zawartość pliku z parametrami inicjalizacyjnymi Sprawdź wykorzystanie pamięci, urządzeń I/O, procesorów. Znajdź procesy, które nadmiernie wykorzystują zasoby Przeprowadź analizę wydajność instancji w kategoriach wykorzystanego czasu procesora i czasu oczekiwania na zasoby (ang. wait time) Znajdź elementy systemu wykorzystujące najwięcej zasobów Przeanalizuj logikę elementu w celu znalezienia przyczyn nadmiernego wykorzystania zasobów Strojenie obszaru współdzielonego 7 8
Obszar współdzielony Rozmiar obszaru współdzielonego ustalany jest dynamicznym parametrem inicjalizacyjnym SHARED_POOL_SIZE Obszar współdzielony składa się z: Bufora bibliotecznego - wykorzystywany do współdzielenia planów wykonania poleceń SQL i kodu PL/SQL Bufora słownikowego - wykorzystywany do buforowania informacji systemowych ze słownika bazy danych Globalnego obszaru uŝytkownika - wykorzystywany w konfiguracji ze współdzielonymi procesami serwera do przechowywania informacji o sesji uŝytkownika Strojenie obszaru współdzielonego ma większy priorytet od strojenia innych obszarów w SGA 9 Bufor biblioteczny Zarządzany za pomocą algorytmu LRU UŜywany do unikania wielokrotnego parsowania tego samego polecenia SQL Zbyt mała wielkość tego obszaru moŝe generować błąd ORA-4031 04031, 00000, "unable to allocate %s bytes of shared memory " // *Cause: More shared memory is needed than was allocated in the shared // pool. // *Action: If the shared pool is out of memory, either use the // dbms_shared_pool package to pin large packages, // reduce your use of shared memory, or increase the amount of // available shared memory by increasing the value of the // INIT.ORA parameters "shared_pool_reserved_size" and // "shared_pool_size". // If the large pool is out of memory, increase the INIT.ORA // parameter "large_pool_size". 10 Strojenie bufora bibliotecznego Upewnienie się, Ŝe aplikacje mogą współdzielić polecenia SQL przez wykorzystywanie zmiennych wiązania (ang. bind variables) zamiast literałów Zapewnienie wystarczająco duŝego obszaru do utrzymywania najczęściej wykonywanych poleceń SQL i kodu PL/SQL Unikanie modyfikowania struktury obiektów bazy danych, które moŝe powodować uniewaŝnianie (ang. invalidation) poleceń SQL w obszarze bibliotecznym Rezerwowanie obszaru dla duŝych obiektów Przypinanie (ang. pinning) duŝych obiektów Eliminowanie anonimowych bloków PL/SQL na rzecz pakietów funkcji i procedur Wykorzystywanie obszaru duŝych obiektów dla konfiguracji współdzielonych serwerów 11 Określenie stopnia współdzielenia kursorów Określenie współczynnika współdzielenia kursorów - w systemach OLTP wartość powinna być większa od 90% SELECT gets, gethits, gethitratio FROM v$librarycache WHERE namespace = 'SQL AREA'; Określenie uruchamianych przez uŝytkowników poleceń SELECT sql_text, users_executing, executions, loads FROM v$sqlarea; SELECT * FROM v$sqltext WHERE sql_text LIKE 'SELECT * FROM scott.emp WHERE %'; 12
Sterowanie współdzieleniem kursorów za pomocą parametru inicjalizacyjnego CURSOR_SHARING są exact - domyślna wartość, literały nie zamieniane na zmienne wiązania, teksty poleceń muszą być identyczne aby mogły współdzielić są kursor similar - literały zamieniane na zmienne wiązania, jeŝeli podobne polecania mają są identyczne plany wykonania force - literały zamieniane na zmienne wiązania niezaleŝnie od planów wykonania Dla źle napisanych aplikacji, które nie wykorzystują zmiennych wiązania dla tych samych poleceń moŝna ustawić parametr inicjalizacyjny CURSOR_SHARING, ustawienie tego parametru powoduje, Ŝe literały są zamieniane na zmienne wiązania: Określenie współczynnika przeładowań Współczynnik przeładowań powinien być mniejszy od 1% SELECT SUM(pins) "Executions", SUM(reloads) "Cache Misses", SUM(reloads)/SUM(pins) FROM v$librarycache; JeŜeli współczynnik przeładowań jest większy od 1% naleŝy zwiększyć wartość parametru SHARED_POOL_SIZE 13 14 UniewaŜnianie obiektów w obszarze bibliotecznym SELECT count(*) FROM scott.emp; SELECT namespace, pins, reloads, invalidations FROM v$librarycache; NAMESPACE PINS RELOADS INVALIDATIONS --------------------- ---------- --------- ------------- SQL AREA 1616 12 0 execute dbms_stats.gather_table_stats ('SCOTT','EMP'); PL/SQL procedure successfully completed. SELECT count(*) FROM scott.emp; SELECT namespace, pins, reloads, invalidations FROM v$librarycache; Szacowanie wielkości obszaru współdzielonego za pomocą parametru inicjalizacyjnego STATISTICS_LEVEL i perspektyw V$SHARED_POOL_ADVICE SELECT shared_pool_size_for_estimate AS pool_size, estd_lc_size, estd_lc_time_saved FROM v$shared_pool_advice; POOL_SIZE ESTD_LC_SIZE ESTD_LC_TIME_SAVED ---------- ------------ ------------------ 80 80 174689 96 95 174691 112 110 174691 128 125 174691 144 140 174695 160 155 174696 176 170 174702 192 189 174706 NAMESPACE PINS RELOADS INVALIDATIONS --------------- ---------- ---------- ------------- SQL AREA 1688 14 3 208 204 174706 15 16
Rezerwowanie ciągłej pamięci w buforze bibliotecznym dla duŝych obiektów SQL i PL/SQL UmoŜliwia zmniejszenie fragmentacji obszaru bibliotecznego Zapewnia obszar do kompilacji duŝych obiektów SQL i PL/SQL Ustawiany za pomocą parametru inicjalizacyjnego SHARED_POOL_RESERVED_SIZE Strojenie zarezerwowanego obszaru w buforze bibliotecznym (1/2) SHARED_POOL_RESERVED_SIZE jest zbyt mały jeŝeli REQUEST_FAILURES jest większy od zera i zwiększa się podczas pracy instancji, rozwiązanie - zwiększenie odpowiednio SHARED_POOL_RESERVED_SIZE i SHARED_POOL_SIZE SHARED_POOL_RESERVED_SIZE jest zbyt duŝy jeŝeli REQUEST_MISSES = 0 lub nie zwiększa się, albo FREE_SPACE>50% w stosunku do SHARED_POOL_RESERVED_SIZE, rozwiązanie - zmniejszenie SHARED_POOL_RESERVED_SIZE 17 18 Strojenie zarezerwowanego obszaru w buforze bibliotecznym (2/2) Przypinanie w buforze bibliotecznym duŝych obiektów PL/SQL select REQUEST_FAILURES, REQUEST_MISSES, FREE_SPACE from v$shared_pool_reserved; REQUEST_FAILURES REQUEST_MISSES FREE_SPACE ---------------- -------------- ---------- 0 0 917562 show parameter SHARED_POOL_RESERVED NAME TYPE VALUE ------------------------------------ ----------- ------------- shared_pool_reserved_size big integer 8388608 Instalacja pakietu DBMS_SHARED_POOL @?/rdbms/admin/dbmspool.sql Znajdowanie nie przypiętych duŝych obiektów PL/SQL w obszarze bibliotecznym SELECT * FROM v$db_object_cache WHERE sharable_mem > 10000 AND (type='package' OR type='package BODY' OR type='function' OR type='procedure') AND kept='no'; 19 Przypinanie duŝych obiektów PL/SQL EXECUTE dbms_shared_pool.keep('nazwa_obiektu'); 20
Przypinanie w buforze bibliotecznym anonimowych bloków PL/SQL Nie zalecane, lepiej dokonać konwersji do procedury w pakiecie DECLARE /* przypnij_mnie */ x number; BEGIN END; x := 5; SELECT address, hash_value FROM v$sqlarea WHERE command_type = 47 AND sql_text LIKE '%przypnij_mnie%'; EXECUTE dbms_shared_pool.keep ( address,hash_value ); 21 Inne parametry inicjalizacyjne mające wpływ na wydajność bufora bibliotecznego OPEN_CURSORS - liczba prywatnych obszarów SQL równocześnie wykorzystywanych przez kursory przez pojedynczy proces serwera, zamknięcie kursora powoduje jego dealokację, domyślnie 50 SESSION_CACHED_CURSORS - umoŝliwia buforowanie kursorów po stronie procesu serwera i odciąŝa wykorzystanie obszaru bibliotecznego, domyślnie 0 CURSOR_SPACE_FOR_TIME - ustawienie na TRUE powoduje, Ŝe współdzielone polecenia SQL w buforze bibliotecznym nie są nigdy wymiatane, moŝna ustawić jeŝeli reloads w v$librarycache = 0 i nie wzrasta, nie ustawiać dla aplikacji Oracle Forms i innych wykorzystujących dynamiczny SQL CURSOR_SHARING - wcześniej omawiany 22 Strojenie bufora słownikowego (1/3) Strojenie bufora słownikowego (2/3) System automatycznie dzieli obszar współdzielony na część bufora bibliotecznego i bufora słownikowe preferując bufor słownikowy, stąd dostrojenie bufora bibliotecznego zazwyczaj powoduje dostrojenie bufora słownikowego Współczynnik nietrafień powinien być <2% dla większości typów obiektów słownika danych oraz <15% dla wszystkich typów obiektów słownika danych Suma getmisses do gets powinna być mniejsza od 15% SELECT sum(getmisses)/sum(gets)*100 getmisses2gets FROM v$rowcache GETMISSES2GETS --------------,723333503 23 24
Strojenie bufora słownikowego (3/3) Współczynnik getmisses do gets powinien być mniejszy od 2% dla większości typów obiektów słownika danych SELECT parameter object_type, getmisses/decode(gets,0,null, gets)*100 getmisses2gets FROM v$rowcache OBJECT_TYPE GETMISSES2GETS -------------------------------- -------------- dc_free_extents dc_used_extents dc_segments 1,65654194 dc_tablespaces,002218628 dc_tablespace_quotas,059691989 dc_files 3,33333333 dc_users,020983153 dc_global_oids,082899907 dc_constraints 42,9906542 dc_object_ids 2,49312055... 25 Globalny obszar uŝytkownika (UGA) Konfiguracja z dedykowanym procesem serwera obszar współdzielony Konfiguracja z współdzielonym procesem serwera obszar współdzielony lub duŝy obszar obszar stosu UGA dane stan sesji kurs. uŝytk. PGA dane sesji uŝytk. UGA stan kurs. PGA obszar stosu 26 Określenie rozmiaru UGA DuŜy obszar Rozmiar UGA wykorzystywanego przez bieŝącą sesję: SELECT SUM(value) 'bytes' "Total session memory" FROM v$mystat, v$statname WHERE name = 'session uga memory' AND v$mystat.statistic# = v$statname.statistic#; Rozmiar UGA wykorzystywany przez wszystkie współdzielone procesy serwerów: SELECT SUM(value) 'bytes' "Total session memory" FROM v$sesstat, v$statname WHERE name = 'session uga memory' AND v$sesstat.statistic# = v$statname.statistic#; Maksymalny rozmiar UGA wykorzystywany przez wszystkie sesje: SELECT SUM(value) 'bytes' "Total max memory" FROM v$sesstat, v$statname WHERE name = 'session uga memory max' AND v$sesstat.statistic# = v$statname.statistic#; 27 Opcjonalny obszar w SGA, wykorzystywany przez: Operacje we/wy dla DBWR_IO_SLAVES Operacje backupu i odtwarzania przez RMAN UGA dla konfiguracji ze współdzielonymi procesami serwera Wymiany komunikatów dla zapytań równoległych UmoŜliwia uniknięcia problemów wydajnościowych związanych ze rywalizacją o dostęp do pamięci współdzielonej Wielkość określana za pomocą parametru inicjalizacyjnego LARGE_POOL_SIZE 28
Wielkość bufora bazy danych Strojenie bufora danych Bufor bazy danych składa się z niezaleŝnych podbuforów dla kaŝdej wykorzystywanej przez bazę danych wielkości bloku bazy danych Parametr inicjalizacyjny DB_BLOCK_SIZE określa podstawową wielkość bloku bazy danych, która jest wykorzystywana przez przestrzeń tabel SYSTEM Wielkości poszczególnych podbuforów dla podstawowej wielkości bloku bazy danych określają parametry: DB_CACHE_SIZE DB_KEEP_CACHE_SIZE DB_RECYCLE_CACHE_SIZE 29 30 Szacowanie wielkości bufora bazy danych Za pomocą dynamicznego parametru inicjalizacyjnego DB_CACHE_ADVICE i perspektyw v$db_cache_advice Dopuszczalne wartości DB_CACHE_ADVICE: off - zbieranie statystyk wyłączone ready - zarezerwowana pamięć w SGA natomiast zbieranie statystyk wyłączone on - zarezerwowana pamięć w SGA włączone zbieranie statystyk 31 Wykorzystanie perspektywy v$db_cache_advice SELECT size_for_estimate "Cache Size (MB)", buffers_for_estimate "Buffers", estd_physical_read_factor AS "Estd Phys Read Factor", estd_physical_reads "Estd Phys Reads" FROM v$db_cache_advice WHERE name = 'DEFAULT' AND block_size = ( SELECT value FROM v$parameter WHERE name = 'db_block_size') AND advice_status = 'ON'; Cache Size (MB) Buffers Estd Phys Read Factor Estd Phys Reads --------------- ---------- --------------------- --------------- 16 2002 1,0004 31678 32 4004 1 31665 48 6006,5801 18370 64 8008,2917 9236 80 10010,25 7916 96 12012,25 7916 112 14014,25 7916... 32
Wskaźniki wydajności bufora bazy danych Współczynnik trafień nie jest najuŝyteczniejszą miarą wydajności bufora bazy danych. Bardziej przydatne są statystyki dotyczące zdarzeń oczekujących (ang. wait events) dostępne przez perspektywy v$sysstat, v$system_event, v$session_wait, przykładowe zdarzenia oczekujące dotyczące bufora bazy danych: Free Buffer Inspected - przeglądanie bloków w celu znalezienia wolnego bloku, jeŝeli zdarzeń oczekujących jest duŝo i ich liczba rośnie naleŝy rozwaŝyć zwiększenie wielkości bufora bazy danych inną przyczyną moŝe być nieefektywne działanie DBW0 Buffer Busy Waits - oczekiwanie na dostęp do tego samego bloku bufora przez wiele procesów serwera, przyczyny: wykorzystanie nieselektywnych indeksów, obciąŝenie indeksu operacjami insert z liczbami generowanymi z sekwencera, modyfikowanie róŝnych wierszy w tym samym bloku, zbyt mała liczba segmentów wycofania 33 Pomiar współczynnika trafień w bufor danych SELECT 1 - (phy.value - lob.value - dir.value) / ses.value "CACHE HIT RATIO" FROM v$sysstat ses, v$sysstat lob, v$sysstat dir, v$sysstat phy WHERE ses.name = 'session logical reads' AND dir.name = 'physical reads direct' AND lob.name = 'physical reads direct (lob)' AND phy.name = 'physical reads'; CACHE HIT RATIO ---------------,79638751 Wartość współczynnik trafień moŝe być spowodowana: Operacjami pełnego przeglądu tabel (ang. full table scan) DuŜymi tabelami z swobodnym dostępem Nierównomiernym rozproszeniem trafień w bufor 34 Przesłanki do zwiększenia wielkości bufora bazy danych Wszystkie zdarzenia oczekujące zostały podstrojone Wszystkie polecenia SQL zostały postrojone Nie ma niebezpieczeństwa stronicowania bufora bazy danych na dysk Poprzednie zwiększenie bufora bazy danych przyniosło zwiększenie wydajności działania bazy danych Współczynnik trafień jest niski Wykorzystanie wielu obszarów buforów KEEP - wykorzystywany do często uŝywanych obiektów bazy danych, wielkość ustalana za pomocą dynamicznego parametru inicjalizacyjnego DB_KEEP_CACHE_SIZE RECYCLE - wykorzystywany do bloków, których szansa ponownego wykorzystania jest mała, wielkość ustalana za pomocą dynamicznego parametru inicjalizacyjnego DB_RECYCLE_CACHE_SIZE DEFAULT - domyślny, wykorzystywany dla wszystkich pozostałych obiektów, wielkość ustalana za pomocą dynamicznego parametru inicjalizacyjnego DB_CACHE_SIZE 35 36
Automatyczne zarządzanie rozszerzeniami segmentów 1/2 Automatyczne zarządzanie rozszerzeniami segmentów 2/2 UET$ FET$ Wygodne w uŝyciu Lepsze wykorzystanie przestrzeni dyskowej, w szczególności gdy rozmiary wierszy w poszczególnych tabelach istotnie się róŝnią Lepsza wydajność przy współbieŝnym dostępie Lokalne zarządzanie jest sterowane bitmapami w plikach danych (domyślne dla 9.2) Zarządzanie przez słownik danych Jest sterowane tabelami UET$ i FET$ (domyślne dla przestrzeni Tabel SYSTEM) 37 38 Utworzenie i wykorzystanie przestrzeni tabel z lokalnie zarządzanymi rozszerzeniami Zarządzanie wolnymi blokami w obiekcie Utworzenie przestrzeni tabel z lokalnie zarządzanymi rozszerzeniami : CREATE TABLESPACE BIT_SEG_TS DATAFILE '$HOME/ORADATA/u04/bit_seg01.dbf' SIZE 100M EXTENT MANAGEMENT LOCAL; Wykorzystanie przestrzeni tabel z lokalnie zarządzanymi rozszerzeniami CREATE TABLE bit_seg_table (idnum NUMBER) TABLESPACE bit_seg_ts; 39 Bloki bitmapowe (sterują dostępem do wolnych bloków) Bloki danych w automatycznie zarządzanym obiekcie Blok nagłówkowy (zawiera wskaźniki do kaŝdego zbioru listy wolnych bloków) Bloki danych w kaŝdym zbiorze wolnych bloków 40
Utworzenie i wykorzystanie przestrzeni tabel z automatycznym zarządzaniem wolnymi blokami w obiekcie Utworzenie przestrzeni tabel z automatycznym zarządzaniem wolnymi blokami w obiekcie: CREATE TABLESPACE BIT_SEG_TS2 DATAFILE '$HOME/ORADATA/u04/bit_seg01.dbf' SIZE 100M EXTENT MANAGEMENT LOCAL SEGMENT SPACE MANAGEMENT AUTO; Strojenie bufora dziennika powtórzeń Wykorzystanie przestrzeni tabel z lokalnie zarządzanymi rozszerzeniami CREATE TABLE bit_seg_table2 (idnum NUMBER) TABLESPACE bit_seg_ts2; 41 42 Określenie rozmiaru bufora dziennika powtórzeń LGWR zapisuje zawartość bufora dziennika powtórzeń do pliku dziennika powtórzeń jeŝeli: 1) uŝytkownik zatwierdzi transakcję, 2) co 3 sekundy, 3) przy wypełnieniu bufora w 1/3, 4) przy zapisie DBW0 jeŝeli odpowiednie wpisy nie zostały jeszcze przepisane na dysk Rozmiar określa się za pomocą parametru inicjalizacyjnego LOG_BUFFERS JeŜeli transakcje są długie lub jest ich równocześnie wiele, to zwiększenie bufora dziennika powtórzeń moŝe zmniejszyć liczbę operacji I/O wykonywanych przez LGWR Częste wykonywanie COMMIT powoduje, Ŝe większy bufor moŝe nie być przydatny 43 Diagnostyka wydajności bufora dziennika powtórzeń (1/2) W przypadku systemów z szybkimi procesorami i stosunkowo wolnymi urządzeniami I/O wolna część bufora moŝe być wypełniona zanim zakończy się poprzedni zapis. Wówczas bufor dziennika powtórzeń moŝe być wąskim gardłem. Większy bufor moŝe zapobiec takiej sytuacji, chyba Ŝe wolumen wpisów w jednostce czasu do bufora dziennika powtórzeń jest większy od szybkości transmisji na dysk. Celem strojenie jest odpowiednie dobranie wielkości bufora dziennika powtórzeń, aby z jednej strony zapewnić odpowiednio szybki zapis do plików dziennika powtórzeń, a z drugiej strony aby nie marnować pamięci, która mogłaby być wykorzystana w innym celu 44
Diagnostyka wydajności bufora dziennika powtórzeń (2/2) Nie powinno duŝo zdarzeń oczekujących na dostęp do bufora SELECT sid, event, seconds_in_wait, state FROM v$session_wait WHERE event = 'log buffer space%'; nie wybranoŝadnych wierszy Współczynnik prób zaalokowania do liczby wpisów powinien być <1% SELECT r.value "Retries", e.value "Entries", r.value/e.value*100 "Percentage" FROM v$sysstat r, v$sysstat e WHERE r.name = 'redo buffer allocation retries' AND e.name='redo entries'; Retries Entries Percentage ---------- ---------- ---------- 30 265870,01128371 45 Przyczyny kiepskich wartości statystyk 1/2 Wolne urządzenie I/O z plikami dziennika powtórzeń Zbyt wolne przełączanie plików dziennika powtórzeń Diagnostyka: SELECT event, total_waits, time_waited, average_wait FROM v$system_event WHERE event like 'log file switch completion%'; EVENT TOTAL_WAITS TIME_WAITED AVERAGE_WAIT -------------------------- ----------- ----------- ------------ log file switch completion 62 2626 42 Rozwiązanie - zwiększenie rozmiaru dzienników powtórzeń Wolne działanie DBWn i nie zakończenie punktu kontrolnego SELECT Diagnostyka: event, total_waits, time_waited, average_wait FROM v$system_event WHERE event like 'log file switch (check%'; nie wybranoŝadnych wierszy Rozwiązanie: sprawdzenie częstotliwości zgłaszania punktu kontrolnego - dynamiczny parametr inicjalizacyjny FAST_START_MTTR_TARGET 46 Przyczyny kiepskich wartości statystyk 2/2 Sprawdź Upewnij się, Ŝe jest wystarczająco duŝo miejsca na urządzeniach archiwizacyjnych grupę Dodaj dziennika powtórzeń zdarzenie Log File Switch (Archiving Needed) SELECT event, total_waits, time_waited, average_wait FROM v$system_event WHERE event like 'log file switch (arch%'; nie wybranoŝadnych wierszy Proces LGWR startuje nowe procesy archiwizacji ARCn kiedy bieŝąca liczba ARCn jest niewystarczająca do obsługi bieŝącego obciąŝenia. Administrator moŝe przewidzieć duŝe obciąŝenie, np. ładowanie danych do hurtowni danych, i odpowiednio maksymalną liczbę ustawić ARCn za pomocą dynamicznego parametru inicjalizacyjnego LOG_ARCHIVE_MAX_PROCESSES Zbyt wolne działanie procesów archiwizacji: 47 Minimalizacja wpisów do plików dziennika powtórzeń Ładowanie danych ścieŝka bezpośrednią (ang. direct load) w trybie bez archiwizacji plików dziennika powtórzeń Ładowanie danych ścieŝka bezpośrednią (ang. direct load) w trybie archiwizacji plików dziennika powtórzeń z opcją NOLOGGING Wykorzystywanie poleceń z opcją NOLOGGING CREATE TABLE... AS SELECT... NOLOGGING CREATE INDEX... NOLOGGING ALTER INDEX... REBUILD NOLOGGING 48
Automatyczne zarządzanie pamięcią sortowania Strojenie operacji sortowania Zastępuje ręczną alokację za pomocą parametrów %_AREA_SIZE Parametry dla automatycznego zarządzania pamięcią sortowania: PGA_AGGREGATE_TARGET (od 10MB do 4000MB) - określa docelowy rozmiar pamięci PGA dla wszystkich dedykowanych sesji przyłączonych do instancji WORKAREA_SIZE_POLICY - dopuszczalne wartości: MANUAL - dezaktywuje automatyczne zarządzania pamięcią AUTO - uaktywnia automatyczne zarządzania pamięcią sortowania sortowania i umoŝliwia ręczną alokację za pomocą parametrów %_AREA_SIZE Obszar roboczy (ang. work area) Obszar roboczy jest fragmentem pamięci operacyjnej przydzielonej do PGA kaŝdego dedykowanego procesu serwera przeznaczonego do sortowania, haszowania i przetwarzania map bitowych np. indeksów bitowych Są trzy sposoby wykorzystania obszarów roboczych: Optymalny (ang. optimal) - obszar jest wystarczająco duŝy aby (np. sortowanie) całkowicie w tym obszarze roboczym Jednoprzebiegowy (ang. one-pass)- obszar jest zbyt mały aby operację (np. sortowanie) wykonać całkowicie w tym obszarze roboczym i wymaga jednokrotnego przetworzenia danych na dysku Wieloprzebiegowy (ang. multi-pass)- obszar jest zbyt mały aby operację (np. sortowanie) wykonać całkowicie w tym obszarze 49 Grupy obszarów roboczych i współczynnik trafień dla PGA Procent wykonań roboczym i wymaga wielokrotnego przetworzenia danych na dysku51 52 100% 0% 0% 64-128KB 94% optymalny jednoprzebiegowy wieloprzebiegowy 6% 0% 128-256KB 0% 97% 64-128MB 3% 50
Określenie obciąŝenia PGA SELECT low_optimal_size/1024 AS low_kb, (high_optimal_size+1)/1024 AS high_kb, ROUND(100*optimal_executions/total_executions) AS optimal, ROUND(100*onepass_executions/total_executions) AS onepass, ROUND(100*multipasses_executions/total_executions) AS mpass FROM v$sql_workarea_histogram WHERE total_executions!= 0 ORDER BY low_kb; LOW_KB HIGH_KB OPTIMAL ONEPASS MULTIPASS ---------- ---------- ---------- ---------- ---------- 8 16 100 0 0 16 32 100 0 0 32 64 100 0 0 64 128 100 0 0 128 256 100 0 0 256 512 91 9 0 512 1024 88 13 0 1024 2048 52 42 6 2048 4096 22 78 0 Szacowanie wielkości pamięci sortowania za pomocą dynamicznego parametru inicjalizacyjnego STATISTICS_LEVEL ustawionego na wartość TYPICAL lub ALL i perspektyw V$PGA_TARGET_ADVICE i V$PGA_TARGET_ADVICE_HISTOGRAM SELECT ROUND(pga_target_for_estimate/1024/1024) AS target_mb, estd_pga_cache_hit_percentage AS cache_hit_percent, estd_overalloc_count FROM v$pga_target_advice ORDER BY target_mb; 4096 8192 0 100 0 53 54 Wynik zapytania do V$PGA_TARGET_ADVICE TARGET_MB CACHE_HIT_PERCENT ESTD_OVERALLOC_COUNT ---------- ----------------- -------------------- 63 23 367 125 24 30 250 30 Zbyt mały rozmiar 3 375 39 1 500 58 0 600 59 0 700 59 0 800 60 0 900 60 0 1000 61 0 1500 67 Punkt przegięcia 0 2000 76 optymalny rozmiar 0 3000 83 0 4000 85 0 Operacje wymagające sortowania danych Tworzenie indeksu Równoległe wstawianie danych (insert) wymagające utrzymywania indeksu Klauzule ORDER BY, GROUP BY Eliminacja duplikatów - DISTINCT Operatory UNION, INTERSECT, MINUS Operacja połączenia metodą sort-merge Zbieranie statystyk 55 56
Strojenie sortowania Diagnostyka operacji sortowania Stosowanie automatycznego zarządzania pamięcią sortowania Unikanie operacji sortowania Unikanie wymiatania i stronicowania przez upewnienie się, Ŝe sortowanie jest wykonywane w pamięci operacyjnej Unikanie operacji sortowania przez: UŜywanie opcji NOSORT przy tworzeniu indeksów UŜywanie UNION ALL zamiast UNION UŜywanie indeksu w dostępie do tabeli Utworzenie indeksu na atrybutach z klauzuli ORDER BY Zbieranie statystyk (histogramów) dla konkretnych atrybutów Zbieranie statystyk dla duŝych obiektów z opcją ESTIMATE zamiast COMPUTE 57 W systemach OLTP stosunek sortowania z wykorzystanie dysku do sortowania z wykorzystaniem jedynie pamięci operacyjnej <5% Zwiększ PGA_AGGREGATE_TARGET jeŝeli współczynnik ten jest >5% SELECT d.value "Disk", m.value "Mem", (d.value/m.value)*100 "Ratio" FROM v$sysstat m, v$sysstat d WHERE m.name = 'sorts (memory)' AND d.name = 'sorts (disk)'; Disk Mem Ratio --------- --------- --------- 23 206 11.165049 58 Konfiguracja tymczasowej przestrzeni tabel UŜywaj tymczasowej przestrzeni tabel z lokalnie zarządzanymi rozszerzeniami z opcją UNIFORM UŜywaj oddzielnych przestrzeni tabel z duŝymi rozszerzeniami dla duŝych operacji sortowania Rozpraszaj tymczasowe przestrzenie tabel na wiele dysków UŜywaj tymczasowych plików dla tymczasowych przestrzeni tabel CREATE TEMPORARY TABLESPACE temp TEMPFILE '/u01/temp1.dbf' AUTOEXTEND ON SIZE 100M NEXT 100M MAXSIZE 1024M TEMPFILE '/u02/temp2.dbf' AUTOEXTEND ON SIZE 100M NEXT 100M MAXSIZE 1024M... Strojenie operacji I/O EXTENT MANAGEMENT LOCAL UNIFORM 59 60
Wskazówki dotyczące strojenie operacji I/O Minimalizuj liczbę logicznych operacji dyskowych Rozpraszaj obciąŝenie na wiele dysków Stosuj odpowiednio skonfigurowaną tymczasową przestrzeń tabel Rozdziel pliki danych i pliki dziennika powtórzeń na róŝne urządzenia dyskowe Rozprosz tabele i/lub na róŝne urządzenia dyskowe Unikaj obciąŝenia niezwiązanego z bazą danych (np. WWW, FTP, SMTP) 61 Wskazówki dotyczące wykorzystania przestrzeni tabel Nie twórz własnych obiektów w przestrzeni tabel SYSTEM Wykorzystuje tabele z lokalnie zarządzanymi rozszerzeniami Rozdziel dane i indeksu do róŝnych przestrzeni tabel Utwórz segmentu wycofania we własnych przestrzeniach tabel Składuj bardzo duŝe obiekty bazy danych we własnych przestrzeniach tabel Wykorzystuj jedną lub więcej tymczasowych przestrzeni tabel CREATE DATABASE mydb DATAFILE 'system01.dbf' SIZE 100M EXTENT MANAGEMENT LOCAL DEFAULT TEMPORARY TABLESPACE temp TEMPFILE 't' SIZE 15M ; 62 Rozpraszanie pliku na róŝne urządzenia dyskowe Rozpraszanie ręczne: CREATE TABLE striped_table STORAGE(MINEXTENTS 10) TABLESPACE tablespace_with_many_files; ALTER TABLE striped_table ALLOCATE EXTENT DATAFILE 2; Rozpraszanie na poziomie systemu operacyjnego: programowe, sprzętowe - macierze RAID Wielkość paska (ang. stripe) - wielokrotność DB_FILE_MULTIBLOCK_READ_COUNT x DB_BLOCK_SIZE Punkty kontrolne Zdarzenia systemowe uaktualniające informacje o najstarszym brudnym bloku w buforze danych - inf. niezbędna do odtwarzania bd po awarii instancji Dwa rodzaje punktów kontrolnych: Przyrostowe punkty kontrolne - na podstawie ciągłej aktywności DBW0, proces punktu kontrolnego CKPT uaktualnia pliki kontrolne i nagłówki bazy danych Pełne punkty kontrolne DBR0 zapisuje w plikach bazy danych wszystkie brudne bufory CKPT uaktualnia pliki kontrolne i nagłówki plików danych Dwie kategorie: Całkowite - np. zamknięcie bazy danych, ręczne wykonanie punktu kontrolnego za pomocą polecenia ALTER SYSTEM CHECKPOINT dla konkretnej przestrzeni tabel - np. wyłączanie przestrzeni tabel, przełączenie w tryb ReadOnly, rozpoczęcie backupu online 63 64
Kolejka punktu kontrolnego Monitorowanie długości kolejki punktu kontrolnego Punkt kontrolny Najwcześniej zmodyfikowane bloki Pliki danych LOG_CHECKPOINT_INTERVAL [OS blocks] LOG_CHECKPOINT_TIMEOUT [s] Najpóźniej zmodyfikowane bloki FAST_START_IO_TARGET [I/O] FAST_START_MMTR_TARGET [s] SELECT * FROM V$INSTANCE_RECOVERY; RECOVERY_ESTIMATED_IOS 281 ACTUAL_REDO_BLKS 2005 TARGET_REDO_BLKS 2098 LOG_FILE_SIZE_REDO_BLKS 184320 LOG_CHKPT_TIMEOUT_REDO_BLKS 2098 LOG_CHKPT_INTERVAL_REDO_BLKS FAST_START_IO_TARGET_REDO_BLKS TARGET_MTTR 42 ESTIMATED_MTTR 17 CKPT_BLOCK_WRITES 124 65 66 Strojenie przestrzeni wycofania 67 Zastosowanie przestrzeni wycofania (ang. undo) Wycofanie transakcji - rollback, recovery Zapewnienie spójności odczytu na poziomie: Polecenia SQL - dla wszystkich rodzajów transakcji Transakcji - dla transakcji READ ONLY oraz SERIALIZABLE Cel strojenia: Zagwarantowanie wystarczającego obszaru aby uniknąć błędu 01555, 00000, "snapshot too old: rollback segment number %s with name \"%s\" too small" // *Cause: rollback records needed by a reader for consistent read are // overwritten by other writers // *Action: If in Automatic Undo Management mode, increase undo_retention // setting. Otherwise, use larger rollback segments Zagwarantowanie wystarczającej liczby segmentów wycofania (ang. rollback segment) aby uniknąć rywalizacji w dostępie do ich nagłówków oraz zawartości Od wersji 9i segmenty wycofania zarządzane automatycznie za pomocą przestrzeni wycofania 68
Unikanie obciąŝania segmentów wycofania Import COMMIT=Y Ustawienie duŝego bufora przetwarzania tablicowego za pomocą ŚcieŜka konwencjonalna - ustawić częstotliwość zatwierdzania za pomocą parametru ROWS BUFFER Export - CONSISTENT=N SQL*Loader ŚcieŜka bezpośrednia Unikanie długich transakcji - ograniczenie czasu bezczynności za pomocą limitu IDLE_TIME Unikanie duŝych transakcji 69 Automatyczne zarządzanie segmentami wycofania Parametr inicjalizacyjny UNDO_MANAGEMENT - dopuszczalne wartości AUTO - uaktywnia automatyczne zarządzanie segmentami wycofania, wymaga utworzenia przestrzeni wycofania MANUAL - umoŝliwia tradycyjne zarządzanie segmentami wycofania Parametr inicjalizacyjny UNDO_RETENTION umoŝliwia określenie minimalnego czasu Ŝycia poprzednich wersji danych (w sekundach) Parametr inicjalizacyjny UNDO_TABLESPACE umoŝliwia wskazanie wykorzystywanej przestrzeni wycofania (opcjonalny jeŝeli w bazie danych zdefiniowano tylko jedną przestrzeń wycofania) Parametr inicjalizacyjny UNDO_SUPPRESS_ERRORS=TRUE umoŝliwia nie generowanie błędu w przypadku wykorzystania polecenia do ręcznego przydziału segmentu wycofania np. SET 70 Zarządzanie przestrzenią wycofania Utworzenie przestrzeni wycofania CREATE DATABASE mydb UNDO TABLESPACE undo DATAFILE 'undo1.dbf' SIZE 500M EXTENT MANAGEMENT LOCAL ; CREATE UNDO TABLESPACE undo1 DATAFILE 'undo1.dbf' SIZE 500M EXTENT MANAGEMENT LOCAL; Zmiana parametrów przestrzeni wycofania ALTER TABLESPACE undo1 ADD DATAFILE 'undo2.dbf' SIZE 500M AUTOEXTEND ON NEXT 100M MAXSIZE 1024M EXTENT MANAGEMENT LOCAL; Przełączanie i usuwanie przestrzeni wycofania ALTER SYSTEM SET UNDO_TABLESPACE=undo2; DROP TABLESPACE undo1; Nie jest aktywną przestrzenią tę wycofania Nie jest potrzebna Ŝadnej aktywnej transakcji w celu wycofania zmian wprowadzonych przez transakcję Zapytania, które wymagają wersji danych z usuniętej przestrzeni tabel kończą się błędem Przestrzeń wycofania moŝe być usunięta jeŝeli: 71 72
Monitorowanie przestrzeni wycofania SELECT to_char(begin_time,'dd-mm-yyyy hh24:mi') begin_time, to_char(end_time, 'hh24:mi') end_time, undoblks,txncount, maxquerylen FROM v$undostat; BEGIN_TIME END_T UNDOBLKS TXNCOUNT MAXQUERYLEN ---------------- ----- ---------- ---------- ----------- 23-11-2004 19:00 19:03 332 6231 149 23-11-2004 18:50 19:00 19 5939 1112 23-11-2004 18:40 18:50 17 5628 738 23-11-2004 18:30 18:40 3 5379 298 23-11-2004 18:20 18:30 13 5056 2 23-11-2004 18:10 18:20 4 4862 3 73 Szacowanie wielkości przestrzeni wycofania SELECT (UR * (UPS * DBS)) + (DBS * 24) AS "Bytes" FROM (SELECT value AS UR FROM v$parameter WHERE name = 'undo_retention'), (SELECT (SUM(undoblks)/SUM(((end_time-begin_time)*86400))) AS UPS FROM v$undostat), (SELECT value AS DBS FROM v$parameter WHERE name = 'db_block_size'); Bytes ---------- 7877801,91 (UR) UNDO_RETENTION w sekundach (UPS) Liczba bloków wycofania generowanych na sekundę (DBS) Narzut zaleŝny od rozmiarów rozszerzeń i plików danych (db_block_size) 74 Monitorowanie wydajności systemu Oracle przy pomocy pakietu STATSPACK RozwaŜania dotyczące wykorzystania urządzeń surowych i macierzy RAID 75 76
Czynniki wpływające na konfigurację systemu dyskowego (1/2) Wydajność Odczyty swobodne - istotne dla: zapytań wykorzystujących indeksu i funkcje haszowe oraz odczytów segmentów ścieŝką wycofania Zapisy swobodne - istotne dla: procesów DBWn w systemach OLTP, mniej istotne w hurtowniach danych Sekwencyjne odczyty - istotne dla: backupu, pełnego odczytu tabeli, tworzenia indeksów, zrównoleglonych zapytań, odczytów segmentów tymczasowych, odtwarzania Sekwencyjne odczyty - istotne dla: procesów LGWR, zapisów segmentów tymczasowych, zapisów bezpośrednią, tworzenia przestrzeni tabel Wpływ wpółbieŝności Czynniki wpływające na konfigurację systemu dyskowego (2/2) Dostępność: Spodziewana częstotliwość awarii (MTTF) Spodziewany czas odtworzenia (MTTR) Degradacja wydajności podczas odtwarzania Koszt: Koszt zakupu, instalacji i konfiguracji Koszt utrzymywania systemu dyskowego na spodziewanym poziomie wydajności i dostępności 77 78 Urządzenia surowe (ang. raw devices) RAID poziom 0 Za Zwiększenie wydajności operacji I/O o 10-15% Przeciw Zwiększone zapotrzebowanie na pamięć operacyjną ze strony buforów danych Trudności w zarządzaniu ze względu na: brak moŝliwości zmiany wielkości urządzenia w trakcie pracy systemu Ograniczoną liczbę urządzeń surowych na jednym urządzeniu dyskowym Trudności częściowo eliminowane przez zastowanie Logical Volume Manager (dla niektórych platform systemu oeracyjnego oddzielnie licencjonowany) Rozproszenie danych między wiele urządzeń dyskowych Charakterystyka wydajności: Swobodne odczyty +++ (jeŝeli 1 I/O mieści się w 1 pasku (ang. stripe)) Swobodne zapisy +++ (jeŝeli 1 I/O mieści się w 1 pasku (ang. stripe)) Sekwencyjne odczyty +++ Sekwencyjne zapisy +++ Dostępność -- Koszt zakupu +++ Koszt utrzymania -- 79 80
RAID poziom 1 Lustrzane odbicie dysków bez rozproszenie danych między wiele urządzeń dyskowych Charakterystyka wydajności: Dostępność Swobodne odczyty ++ Swobodne zapisy ++ Sekwencyjne odczyty + Sekwencyjne zapisy + +++ Koszt zakupu -- Koszt utrzymania + RAID poziom 1+0 Lustrzane odbicie dysków z rozproszeniem danych między wiele urządzeń dyskowych Charakterystyka wydajności: Swobodne odczyty +++ (jeŝeli 1 I/O mieści się Dostępność w 1 pasku (ang. stripe)) Swobodne zapisy ++ (jeŝeli 1 I/O mieści się w 1 pasku (ang. stripe)) Sekwencyjne odczyty +++ Sekwencyjne zapisy + +++ Koszt zakupu -- Koszt utrzymania + 81 82 RAID poziom 5 Redundancja danych w postaci sum kontrolnych rozproszonych razem z danymi między wiele urządzeń dyskowych Charakterystyka wydajności: Swobodne odczyty +++ (jeŝeli 1 I/O mieści się Dostępność w 1 pasku (ang. stripe)) Swobodne zapisy - Sekwencyjne odczyty +++ Sekwencyjne zapisy + - ++ Koszt zakupu + Koszt utrzymania + 83 Ranking róŝnych poziomów RAID dla poszczególnych plików bazy danych Oracle 0 1 1+0 3 5 Pliki kontrolne 2 1 2 1 5 3 Pliki dziennika 4 1 5 1 2 3 Przestrzeń powtórzeń t. SYSTEM 2 1 2 1 5 3 Segmenty tymczasowe 4 1 5 1 2 3 Segmenty wycofania 2 1 2 1 5 5 Dane - swobodny odczyt 2 1 2 1 5 1 Dane - sekwencyjny odczyt 4 1 5 1 2 3 Dane - zapis swobodny 1 1 2 1 5 5 Dane - zapis sekwencyjny 4 5 1 1 2 2 dostępność 4 5 1 1 2 2 koszt 1 5 5 5 3 3 84
Przegląd własności pakietu STATSPACK Następca skryptów UTLBSTAT/ULESTAT. Dostępny od wersji Oracle8i 8.1.6. Składuje informacje o wydajności systemu umoŝliwiając późniejszą ich analizę. Dostarcza skrypt SQL Plus generujący czytelnie sformatowany raport. MoŜe być wykorzystywany bez ograniczeń w środowisku serwera równoległego (Oracle Parallel Server). UmoŜliwia wyszukanie najkosztowniejszych poleceń SQL. Zalecane ustawienie parametru inicjacyjnego TIMED_STATISTICS na wartość TRUE. Instalacja i deinstalacja pakietu STATSPACK Uruchomienie skryptów z katalogu $ORACLE_HOME/rdbms/admin jako uŝytkownik z uprawnieniami SYSDBA: spcreate.sql spdrop.sql -> Tworzy całe środowisko Statspack (wywołuje: spcusr.sql, spctab.sql, spcpkg.sql) -> Usuwa całe środowisko Statspack (wywołuje: spdtab.sql, spdusr.sql) 85 86 Przykład instalacji interakcyjnej... Below are the list of online tablespaces in this database. Decide which tablespace you wish to create the STATSPACK tables and indexes. This will also be the PERFSTAT user's default tablespace. Using the SYSTEM tablespace to store statistical data is NOT recommended. TABLESPACE_NAME ------------------------------ SYSTEM USERS RBS TEMP Specify PERFSTAT user's default tablespace Enter value for default_tablespace: users Using users for the default tablespace User altered. User altered. Przykład instalacji wsadowej SQL> connect / as sysdba SQL> define default_tablespace='users' SQL> define temporary_tablespace='temp' SQL> @?/rdbms/admin/spcreate... Raporty poprawności instalacji Tworzenie uŝytkownika spcusr.lis Tworzenie tabel - spctab.lis Tworzenie pakietu - spcpkg.lis Specify PERFSTAT user's temporary tablespace Enter value for temporary_tablespace: temp User altered. 87 88
Przegląd interfejsu pakietu STATSPACK Procedura SNAP zbiera i zapisuje do tabel wybrane informacje wydajnościowe wykonuje migawkę Procedura MODIFY_STATSPACK_PARAMETER zmienia domyślne wartości parametrów procedur SNAP 89 Parametry procedury SNAP (1) I_SNAP_LEVEL poziom szczegółowości zbieranych informacji wydajnościowych, poprawne wartości (domyślnie: 5): 0 podstawowy zbiór statystyk, 5 0 + statystyki TopN dla poleceń SQL, 10 5 + dodatkowe statystyki dla zatrzasków (dla Asysty Technicznej Oracle), I_UCOMMENT komentarz uŝytkownika (domyślnie: NULL), I_NUM_SQL liczba wyświetlanych poleceń SQL w statystykach TopN (domyślnie: 5), I_EXECUTIONS_TH graniczna liczba wykonań polecenia SQL, które ma być umieszczone w statystykach TopN (domyślnie: 100), I_PARSE_CALLS_TH graniczna liczba operacji parse polecenia SQL, które ma być umieszczone w statystykach TopN (domyślnie: 1000), I_DISK_READS_TH - graniczna liczba odczytów z dysku polecenia SQL, które ma być umieszczone w statystykach TopN (domyślnie: 1000), 90 Parametry procedury SNAP (2) I_BUFFER_GETS_TH - graniczna liczba odczytów z bufora danych polecenia SQL, które ma być umieszczone w statystykach TopN (domyślnie: 10.000), I_SHARABLE_MEM_TH - graniczna wielkość pamięci współdzielonej przeznaczonej dla polecenia SQL, które ma być umieszczone w statystykach TopN (domyślnie: 1048576), I_VERSION_COUNT_TH - graniczna liczba wersji polecenia SQL, które ma być umieszczone w statystykach TopN (domyślnie: 20), I_PIN_STATSPACK czy przypiąć pakiet STASPACK w pamięci SGA? (domyślnie: TRUE) I_MODIFY_PARAMETER czy podane wartości parametrów uczynić domyślnymi? (domyślnie: FALSE) Parametry procedury MODIFY_STATSPACK_PARAMETER I_SNAP_LEVEL - jak w SNAP I_UCOMMENT - jak w SNAP I_NUM_SQL - jak w SNAP I_EXECUTIONS_TH - jak w SNAP I_PARSE_CALLS_TH - jak w SNAP I_DISK_READS_TH - jak w SNAP I_BUFFER_GETS_TH - jak w SNAP I_SHARABLE_MEM_TH - jak w SNAP I_VERSION_COUNT_TH - jak w SNAP I_PIN_STATSPACK - jak w SNAP I_MODIFY_PARAMETER - jak w SNAP (domyślnie TRUE) 91 92
Przykłady uŝycia procedury SNAP i MODIFY_STATSPACK_PARAMETER Rem jako uŝytkownik PERFSTAT SQL> exec statspack.snap(i_snap_level=>0, - i_ucomment=>'pierwsza migawka') Procedura PL/SQL została zakończona pomy lnie. SQL> exec statspack.modify_statspack_parameter - (i_num_sql=>10) Procedura PL/SQL została zakończona pomy lnie. Pomocnicze skrypty spreport.sql generuje wygodnie sformatowany raport oparty na danych z dwóch wybranych migawek, spauto.sql umoŝliwia automatyzację uruchamiania migawek (wykorzystuje pakiet DBMS_JOBS parametry inicjalizacyjne: JOB_QUEUE_PROCESSES, JOB_QUEUE_INTERVAL) sppurge.sql słuŝy do usuwania z danych związanych z wyspecyfikowanymi migawkami, 93 94 Przykład zastosowania skryptu SPREPORT SQL> @?\rdbms\admin\spreport DB Id DB Name Inst Num Instance ----------- ------------ -------- ------------ 350998986 LAB81 1 lab81 Completed Snapshots Snap Snap Instance DB Name Id Snap Started Level Comment ------------ ------------ ----- ----------------- ----- ---------------------- lab81 LAB81 1 10 Sty 2002 15:54 5 pierwsza migawka 2 11 Sty 2002 16:04 5 druga migawka 3 12 Sty 2002 16:04 5 trzecia migawka Specify the Begin and End Snapshot Ids ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Podaj dla begin_snap: 1 Begin Snapshot Id specified: 1 Podaj warto ć dla end_snap: 3 End Snapshot Id specified: 3 Specify the Report Name ~~~~~~~~~~~~~~~~~~~~~~~ The default report file name is sp_1_3. To use this name, press <return> to continue, otherwise enter an alternative. Podaj warto ć dla report_name: Przykład zastosowania skryptu SPAUTO SQL> @?\rdbms\admin\spauto Job number for automated statistics collection for this instance ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Note that this job number is needed when modifying or removing the job: 201 Job queue process ~~~~~~~~~~~~~~~~~ Below is the current setting of the job_queue_processes init.ora parameter - the value for this parameter must be greater than 0 to use automatic statistics gathering: NAME TYPE VALUE ------------------------------------ ------- ------------------------------ job_queue_processes integer 4 Next scheduled run ~~~~~~~~~~~~~~~~~~ The next scheduled run for this job is: JOB NEXT_DAT NEXT_SEC ---------- -------- -------- Using the report name sp_1_3... 201 02/01/10 16:00:00 95 96
Przykład zastosowania skryptu SPPURGE (1) Przykład zastosowania skryptu SPPURGE (2) SQL> @?\rdbms\admin\sppurge Database Instance currently connected to ======================================== DB Id DB Name InstNum Name ----------- ---------- -------- ---------- 350998986 LAB81 1 lab81 Snapshots for this database instance ==================================== Snap Snap Id Level Snapshot Started Host Comment -------- ----- --------------------- --------------- ------------------ 1 5 10 Sty 2002 15:29:31 uran 2 5 10 Sty 2002 15:29:51 uran Warning ~~~~~~~ sppurge.sql deletes all snapshots ranging between the lower and upper bound Snapshot Id's specified, for the database instance you are connected to. Specify the Lo Snap Id and Hi Snap Id range to purge ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Podaj warto ć dla losnapid: 1 Using 1 for lower bound. Podaj warto ć dla hisnapid: 2 Using 2 for upper bound. Deleting snapshots 1-2. Purge of specified Snapshot range complete. If you wish to ROLLBACK the purge, it is still possible to do so. Exitting from SQL*Plus will automatically commit the purge. SQL> commit; Zatwierdzanie zostało ukończone You may wish to export this data before continuing. 97 98 Nagłówek raportu STATSPACK i rozmiary obszarów buforowych STATSPACK report for Zawartość raportu STATSPACK DB Name DB Id Instance Inst Num Release OPS Host ------------ ----------- ------------ -------- ----------- --- ------------ ORCL 1 1st 1 7.3.4 0 localhost Snap Id Snap Time Sessions ------- ------------------ -------- Begin Snap: 43 05-Gru-01 07:30:21 11 End Snap: 75 05-Gru-01 23:15:47 11 Elapsed: 945.43 (mins) Cache Sizes ~~~~~~~~~~~ db_block_buffers: 40000 log_buffer: 256000 db_block_size: 2048 shared_pool_size: 150000000 99 100
Profil obciąŝenia Load Profile ~~~~~~~~~~~~ Per Second Per Transaction --------------- --------------- Redo size: 4,304.47 13,538.23 Logical reads: 16,613.78 52,252.90 Block changes: 40.62 127.76 Physical reads: 174.77 549.69 Physical writes: 8.61 27.08 User calls: 71.12 223.69 Parses: 8.59 27.01 Hard parses: Sorts: 5.66 17.80 Logons: 0.02 0.08 Executes: 184.45 580.12 Transactions: 0.32 % Blocks changed per Read: 0.24 Recursive Call %: 80.15 Rollback per transaction %: 9.61 Rows per Sort: 102.83 Profil obciąŝenia - komentarz MoŜe słuŝyć: do aktywnego monitorowania zmian obciąŝenie systemu. MoŜe słuŝyć: do monitorowania wysokiej aktywności wyróŝnionych części systemu. Trudno zdefiniować wysoką aktywność, zaleŝy od: urządzeń liczby i mocy procesorów, I/O, systemu operacyjnego, wersji systemu Oracle, charakteru aplikacji. 101 102 Profil obciąŝenia operacja parse Hard parses /s > 100 - bardzo duŝo MoŜe powodować rywalizację o zatrzaski (latch) synchronizujące dostęp do obszaru bibliotecznego SQL i obszaru słownika bd. Wymaga szczegółowego wyjaśnienia z wykorzystaniem sekcji Statystyki aktywności zatrzasków. Soft parses /s > 300 - bardzo duŝo MoŜe powodować podobne skutki. Zazwyczaj spowodowany błędnym projektem aplikacji. Statystyki wydajności i statystyki obszaru współdzielonego Instance Efficiency Percentages (Target 100%) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Buffer Nowait %: 100.00 Redo NoWait %: 99.99 Buffer Hit %: 98.95 In-memory Sort %: 99.96 Library Hit %: 99.63 Soft Parse %: Execute to Parse %: 95.34 Latch Hit %: 99.99 Parse CPU to Parse Elapsd %: 62.44 % Non-Parse CPU: 99.99 Shared Pool Statistics Begin End ------ ------ Memory Usage %: 41.34 99.86 % SQL with executions>1: 77.36 50.34 % Memory for SQL w/exec>1: 72.35 43.35 103 104
Statystyki wydajności - komentarz współczynnik: Buffer Nowait Buffer Hit Library Hit reakcja na zbyt małą wartość: Patrz: Zdarzenia oczekujące, Oczekiwania na bufory danych Indeksowanie danych itp., DB_BLOCK_BUFFERS Patrz: Statystyki obszaru bibliotecznego SQL, SHARED_POOL_SIZE Execute to Parse Problemy w konstrukcji aplikacji Parse CPU to Parse Problemy z oczekiwaniem na zatrzaski lub na I/O <- Elapsd hard parses, In-memory Sort RozwaŜenie hash-join, SORT_AREA_SIZE Soft Parse Problemy z hard parses, CURSOR_SHARING (8.1.6) Latch Hit Patrz: Statystyki wykorzystania zatrzasków Non-Parse CPU Problemy w konstrukcji aplikacji Zdarzenia oczekujące (5 sumarycznie najdłuŝszych) Top 5 Wait Events ~~~~~~~~~~~~~~~~~ Wait % Total Event Waits Time (cs) Wt Time -------------------------------------------- ------------ ------------ ------- latch free 69,829 612,522 59.82 db file sequential read 1,272,528 124,301 12.14 db file scattered read 548,320 119,827 11.70 db file parallel write 24,816 50,815 4.96 free buffer waits 1,685 25,764 2.52 --------------------------------------------------------------- 105 106 Zdarzenia oczekujące komentarz (1) Szczegółowy opis zdarzeń: Oracle8i Reference, dodatek A: Oracle Wait Events db file scattered read i db file sequential read swobodny i sekwencyjny odczyt danych, wysokie wartości mogą być spowodowane: Nieefektywny dostęp do danych (niedostrojone polecenia SQL), PrzeciąŜone urządzenia I/O, NiezrównowaŜone obciąŝenie I/O, Inne zdarzenia I/O z: db file parallel write, direct read, direct write, log file parallel write Szczegółowego wyjaśnienie w sekcji Statystyki aktywności I/O Zdarzenia oczekujące komentarz (2) latch free oczekiwanie na zwolnienie niskopoziomowej blokady, synchronizującej dostęp do wewnętrznych struktur systemu np.: listy LRU brudnych bloków, szczegóły w sekcji: Statystki aktywności zatrzasków enqueue rodzaj niskopoziomowej blokady synchronizującej dostęp do zasobów w postaci kolejek np.: kolejka zadań, szczegóły w sekcji: Statystyki oczekiwań na dostęp blokad free buffer wait brak wolnych buforów do wczytania danych przez serwer danych z dysku, przyczyna: Za mała liczba buforów danych DB_BLOCK_BUFFERS, Nieefektywne działanie DBWR, Szczegóły: Statystyki aktywności IO 107 108
Zdarzenia oczekujące komentarz (3) buffer busy wait oczekiwanie procesu serwera na dostęp do bufora danych, który jest: Aktualnie wczytywany lub Jest wykorzystywany w sposób wyłączny Szczegóły w sekcjach: Statystyki oczekiwań na dostęp buforów danych, Statystyki aktywności IO write complete waits oczekiwanie serwera na dostęp do bufora aktualnie zapisywanego przez DBWR, przyczyny: Zbyt wolny DBWR, rozwiązanie: asynchroniczny zapis, Zbyt wolne urządzenie I/O, Za buforów danych, DB_BLOCK_SIZE, DuŜa liczba procesów wykorzystujących mało-selektywne indeksy szczegóły w sekcji: N najbardziej obciąŝających poleceń SQL (wg dostępów do bufora danych) 109 Zdarzenia oczekujące dla procesów serwerów (wszystkie) Wait Events for DB: ORCL Instance: 1st Snaps: 43-75 -> cs - centisecond - 100th of a second -> ms - millisecond - 1000th of a second -> ordered by wait time desc, waits desc (idle events last) Avg Total Wait wait Waits Event Waits Timeouts Time (cs) (ms) /txn ---------------------------- ------------ ---------- ----------- ------ ------ latch free 69,829 5,944 612,522 88 3.9 db file sequential read 1,272,528 0 124,301 1 70.6 db file scattered read 548,320 0 119,827 2 30.4 db file parallel write 24,816 187 50,815 20 1.4 free buffer waits 1,685 153 25,764 153 0.1 log file sync 25,723 110 19,729 8 1.4 SQL*Net more data to client 83,516 0 15,073 2 4.6 log file parallel write 34,871 0 11,427 3 1.9 SQL*Net break/reset to clien 771 0 6,705 87 0.0 write complete waits 245 15 3,234 132 0.0 enqueue 21 8 3,089 1471 0.0... SQL*Net message from client 4,039,594 0 ########### 633 224.0 SQL*Net message to client 4,039,598 0 2,413 0 224.0 SQL*Net more data from clien 3,889 0 182 0 0.2 --------------------------------------------------------------- 110 Zdarzenia oczekujące dla procesów drugoplanowych Background Wait Events for DB: ORCL Instance: 1st Snaps: 43-75 -> ordered by wait time desc, waits desc (idle events last) Avg Total Wait wait Waits Event Waits Timeouts Time (cs) (ms) /txn ---------------------------- ------------ ---------- ----------- ------ ------ latch free 514 507 51,210 996 0.0 db file parallel write 24,816 187 50,815 20 1.4 log file parallel write 34,871 0 11,427 3 1.9 log file sync 812 6 1,365 17 0.0 rdbms ipc reply 55 1 929 169 0.0 control file parallel write 2,486 0 848 3 0.1 db file sequential read 2,447 0 793 3 0.1 db file scattered read 1,096 0 319 3 0.1 db file single write 1,836 0 263 1 0.1 control file sequential read 1,188 0 203 2 0.1 log file switch completion 1 0 65 650 0.0 log file sequential read 54 0 50 9 0.0 log file single write 108 0 6 1 0.0 enqueue 1 0 0 0 0.0 rdbms ipc message 96,131 57,244 22,663,131 2358 5.3 smon timer 190 189 5,676,823 ###### 0.0 pmon timer 18,846 18,844 5,672,548 3010 1.0 --------------------------------------------------------------- 111 N najbardziej obciąŝających poleceń SQL (wg dostępów do bufora danych) SQL ordered by Gets for DB: ORCL Instance: 1st Snaps: 43-75 -> End Buffer Gets Threshold: 10000 -> Note that resources reported for PL/SQL includes the resources used by all SQL statements called within the PL/SQL code. As individual SQL statements are also reported, it is possible and valid for the summed total % to exceed 100 Buffer Gets Executions Gets per Exec % Total Hash Value --------------- ------------ -------------- ------- ------------ 639,662,472 117 5,467,200.6 67.9 1541704567 begin :X0 := DBMS_SQL.EXECUTE(:C); end; 558,913,946 1,853 301,626.5 59.3 791506639 SELECT * FROM FA_POZYCJE_KALKULACJI WHERE PKAL_FA_ID = :b1 O R PKAL_PF_ID IN (SELECT PF_ID FROM FA_POZYCJE_FAKTUR WHERE PF _FA_ID = :b1 ) 513,720,948 1 513,720,948.0 54.5 471789237 begin FA_PCK_DOK.UKONCZ_GRUPE_DS(472); end; --------------------------------------------------------------- 112