Strojenie instancji bazy danych Oracle9i Kiedy i co stroić? Kiedy i co
Transkrypt
Strojenie instancji bazy danych Oracle9i Kiedy i co stroić? Kiedy i co
Kiedy i co stroić? ♦ Koszt strojenia w trakcie budowy i eksploatacji systemu informatycznego koszt Strojenie instancji bazy danych Oracle9i czas projekt implementacja eksploatacja ♦ Efekt strojenia w trakcie budowy i eksploatacji systemu informatycznego [email protected] efekt czas projekt implementacja eksploatacja 1 2 Cele strojenia ♦ ♦ ♦ ♦ ♦ Kroki strojenia systemu aplikacji ♦ ♦ ♦ ♦ ♦ ♦ Czas odpowiedzi systemu (aplikacji) Przepustowość Szybkość ładowania danych Czas odtwarzania po awarii Oczekiwania uŜytkowników 3 Strojenie projektu Strojenie aplikacji Strojenie pamięci Strojenie I/O Strojenie rywalizacji Strojenie systemu operacyjnego 4 Statystyki punktu odniesienia Kroki strojenia instancji bazy danych ♦ 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 1. 2. 3. 4. 5. 6. 7. Zdefiniuj problem Zbierz statystyki instancji i systemu operacyjnego RozwaŜ często spotykane przyczyny słabej wydajności Przemyśl moŜliwe działania Przeprowadź zaplanowane działania i zmierz ich skutki Sprawdź czy wąskie gardło zostało usunięte 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 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 ♦ 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 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". ♦ Strojenie obszaru współdzielonego ma większy priorytet od strojenia innych obszarów w SGA 9 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 10 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 Określenie współczynnika przeładowań ♦ Współczynnik przeładowań powinien być mniejszy od 1% ♦ 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: SELECT SUM(pins) "Executions", SUM(reloads) "Cache Misses", SUM(reloads)/SUM(pins) FROM v$librarycache; exact - domyślna wartość, literały nie są zamieniane na zmienne wiązania, teksty poleceń muszą być identyczne aby mogły współdzielić kursor similar - literały są zamieniane na zmienne wiązania, jeŜeli podobne polecania mają identyczne plany wykonania force - literały są zamieniane na zmienne wiązania niezaleŜnie od planów wykonania ♦ JeŜeli współczynnik przeładowań jest większy od 1% naleŜy zwiększyć wartość parametru SHARED_POOL_SIZE 13 UniewaŜnianie obiektów w obszarze bibliotecznym 14 Szacowanie wielkości obszaru współdzielonego SELECT count(*) FROM scott.emp; ♦ za pomocą parametru inicjalizacyjnego STATISTICS_LEVEL i perspektyw V$SHARED_POOL_ADVICE 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'); 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 208 204 174706 PL/SQL procedure successfully completed. SELECT count(*) FROM scott.emp; SELECT namespace, pins, reloads, invalidations FROM v$librarycache; NAMESPACE PINS RELOADS INVALIDATIONS --------------- ---------- ---------- ------------SQL AREA 1688 14 3 … 15 16 Rezerwowanie ciągłej pamięci w buforze bibliotecznym dla duŜych obiektów SQL i PL/SQL 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 ♦ 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 17 Strojenie zarezerwowanego obszaru w buforze bibliotecznym (2/2) 18 Przypinanie w buforze bibliotecznym duŜych obiektów PL/SQL Instalacja pakietu DBMS_SHARED_POOL select REQUEST_FAILURES, REQUEST_MISSES, FREE_SPACE from v$SHARED_POOL_RESERVED; @?/rdbms/admin/dbmspool.sql REQUEST_FAILURES REQUEST_MISSES FREE_SPACE ---------------- -------------- ---------0 0 917562 Znajdowanie nie przypiętych duŜych obiektów PL/SQL w obszarze bibliotecznym show parameter SHARED_POOL_RESERVED SELECT * FROM v$db_object_cache NAME TYPE VALUE ------------------------------------ ----------- ------------shared_pool_reserved_size big integer 8388608 WHERE sharable_mem > 10000 AND (type='PACKAGE' OR type='PACKAGE BODY' OR AND type='FUNCTION' OR type='PROCEDURE') kept='NO'; Przypinanie duŜych obiektów PL/SQL EXECUTE dbms_shared_pool.keep('nazwa_obiektu'); 19 20 Przypinanie w buforze bibliotecznym anonimowych bloków PL/SQL 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 Nie zalecane, lepiej dokonać konwersji do procedury w pakiecie DECLARE /* przypnij_mnie */ x number; BEGIN x := 5; END; 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 Strojenie bufora słownikowego (1/3) 22 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 23 ♦ Suma getmisses do gets powinna być mniejsza od 15% SELECT sum(getmisses)/sum(gets)*100 getmisses2gets FROM v$rowcache GETMISSES2GETS -------------,723333503 24 Strojenie bufora słownikowego (3/3) Globalny obszar uŜytkownika (UGA) ♦ Współczynnik getmisses do gets powinien być mniejszy od 2% dla większości typów obiektów słownika danych Konfiguracja z dedykowanym procesem serwera PGA UGA SELECT obszar stosu obszar współdzielony 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 ... dane sesji uŜytk. stan kurs. Konfiguracja z współdzielonym procesem serwera obszar współdzielony lub duŜy obszar UGA stan dane sesji kurs. uŜytk. PGA obszar stosu 25 Określenie rozmiaru UGA 26 DuŜy obszar Rozmiar UGA wykorzystywanego przez bieŜącą sesję: ♦ 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 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 ♦ 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 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 28 Wielkość bufora bazy 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: Strojenie bufora danych DB_CACHE_SIZE DB_KEEP_CACHE_SIZE DB_RECYCLE_CACHE_SIZE 29 30 Wykorzystanie perspektywy v$db_cache_advice Szacowanie wielkości bufora bazy danych 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'; ♦ 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 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 ... 31 32 Pomiar współczynnika trafień w bufor danych 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 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 33 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 34 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 UET$ Lokalne zarządzanie jest sterowane bitmapami w plikach danych (domyślne dla 9.2) Automatyczne zarządzanie rozszerzeniami segmentów 2/2 ♦ 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 FET$ Zarządzanie przez słownik danych Jest sterowane tabelami UET$ i FET$ (domyślne dla przestrzeni Tabel SYSTEM) 37 Utworzenie i wykorzystanie przestrzeni tabel z lokalnie zarządzanymi rozszerzeniami 38 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 Bloki bitmapowe (sterują dostępem do wolnych bloków) CREATE TABLE bit_seg_table (idnum NUMBER) TABLESPACE bit_seg_ts; Bloki danych w automatycznie zarządzanym obiekcie 39 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ń Diagnostyka wydajności bufora dziennika powtórzeń (1/2) ♦ 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 ♦ 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 43 44 Diagnostyka wydajności bufora dziennika powtórzeń (2/2) Przyczyny kiepskich wartości statystyk 1/2 ♦ Nie powinno duŜo zdarzeń oczekujących na dostęp do bufora Diagnostyka: SELECT sid, event, seconds_in_wait, state FROM v$session_wait WHERE event = 'log buffer space%'; SELECT event, total_waits, time_waited, average_wait FROM v$system_event WHERE event like 'log file switch completion%'; nie wybrano Ŝadnych wierszy EVENT TOTAL_WAITS TIME_WAITED AVERAGE_WAIT -------------------------- ----------- ----------- -----------log file switch completion 62 2626 42 ♦ 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 Rozwiązanie - zwiększenie rozmiaru dzienników powtórzeń ♦ Wolne działanie DBWn i nie zakończenie punktu kontrolnego SELECT event, total_waits, time_waited, average_wait Diagnostyka: FROM v$system_event WHERE event like 'log file switch (check%'; nie wybrano Ŝadnych wierszy Rozwiązanie: sprawdzenie częstotliwości zgłaszania punktu 45 Przyczyny kiepskich wartości statystyk 2/2 kontrolnego - dynamiczny parametr inicjalizacyjny FAST_START_MTTR_TARGET 46 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 ♦ Zbyt wolne działanie procesów archiwizacji: Upewnij się, Ŝe jest wystarczająco duŜo miejsca na urządzeniach ♦ Wolne urządzenie I/O z plikami dziennika powtórzeń ♦ Zbyt wolne przełączanie plików dziennika powtórzeń archiwizacyjnych Dodaj grupę dziennika powtórzeń Sprawdź 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 CREATE TABLE ... AS SELECT ... NOLOGGING CREATE INDEX ... NOLOGGING ALTER INDEX ... REBUILD NOLOGGING 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 ustawić maksymalną liczbę ARCn za pomocą dynamicznego parametru inicjalizacyjnego LOG_ARCHIVE_MAX_PROCESSES 47 48 Automatyczne zarządzanie pamięcią sortowania ♦ Zastępuje ręczną alokację za pomocą parametrów %_AREA_SIZE ♦ Parametry dla automatycznego zarządzania pamięcią sortowania: Strojenie operacji 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: • AUTO - uaktywnia automatyczne zarządzania pamięcią sortowania • MANUAL - dezaktywuje automatyczne zarządzania pamięcią sortowania i umoŜliwia ręczną alokację za pomocą parametrów %_AREA_SIZE 49 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: 50 Grupy obszarów roboczych i współczynnik trafień dla PGA Procent wykonań optymalny jednoprzebiegowy wieloprzebiegowy 97% 100% 94% Optymalny (ang. optimal) - obszar jest wystarczająco duŜy aby operację (np. sortowanie) wykonać 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 roboczym i wymaga wielokrotnego przetworzenia danych na dysku51 0% … 64-128KB 0% 6% 0% 128-256KB 0% … 3% 64-128MB 52 Określenie obciąŜenia PGA Szacowanie wielkości pamięci sortowania 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 4096 8192 0 100 0 ♦ 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; 53 Wynik zapytania do V$PGA_TARGET_ADVICE 54 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 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 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: ♦ 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% 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 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 --------23 Mem --------206 Ratio --------11.165049 57 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 ... EXTENT MANAGEMENT LOCAL UNIFORM Strojenie operacji I/O 59 60 Wskazówki dotyczące wykorzystania przestrzeni tabel Wskazówki dotyczące strojenie operacji I/O ♦ 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 ♦ 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 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 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, ♦ 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 63 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 64 Monitorowanie długości kolejki punktu kontrolnego Kolejka punktu kontrolnego Punkt kontrolny LOG_CHECKPOINT_INTERVAL [OS blocks] SELECT * FROM V$INSTANCE_RECOVERY; LOG_CHECKPOINT_TIMEOUT [s] Najwcześniej zmodyfikowane bloki Pliki danych Najpóźniej zmodyfikowane bloki FAST_START_IO_TARGET [I/O] FAST_START_MMTR_TARGET [s] 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 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: Strojenie przestrzeni wycofania 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 67 68 Unikanie obciąŜania segmentów wycofania Automatyczne zarządzanie segmentami wycofania ♦ Parametr inicjalizacyjny UNDO_MANAGEMENT dopuszczalne wartości ♦ Import AUTO - uaktywnia automatyczne zarządzanie segmentami COMMIT=Y Ustawienie duŜego bufora przetwarzania tablicowego za pomocą BUFFER ♦ Export - CONSISTENT=N ♦ SQL*Loader ŚcieŜka konwencjonalna - ustawić częstotliwość zatwierdzania za pomocą parametru ROWS ŚcieŜka bezpośrednia ♦ Unikanie długich transakcji - ograniczenie czasu bezczynności za pomocą limitu IDLE_TIME ♦ Unikanie duŜych transakcji 69 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 70 do ręcznego przydziału segmentu wycofania np. SET Przełączanie i usuwanie przestrzeni wycofania Zarządzanie przestrzenią wycofania ♦ Utworzenie przestrzeni wycofania ALTER SYSTEM SET UNDO_TABLESPACE=undo2; CREATE DATABASE mydb UNDO TABLESPACE undo DATAFILE 'undo1.dbf' SIZE 500M EXTENT MANAGEMENT LOCAL …; DROP TABLESPACE undo1; ♦ Przestrzeń wycofania moŜe być usunięta jeŜeli: CREATE UNDO TABLESPACE undo1 DATAFILE 'undo1.dbf' SIZE 500M EXTENT MANAGEMENT LOCAL; Nie jest aktywną przestrzenią wycofania Nie jest potrzebna Ŝadnej aktywnej transakcji w celu wycofania ♦ Zmiana parametrów przestrzeni wycofania ALTER TABLESPACE undo1 ADD DATAFILE 'undo2.dbf' SIZE 500M AUTOEXTEND ON NEXT 100M MAXSIZE 1024M EXTENT MANAGEMENT LOCAL; 71 zmian wprowadzonych przez tę transakcję Zapytania, które wymagają wersji danych z usuniętej przestrzeni tabel kończą się błędem 72 Szacowanie wielkości przestrzeni wycofania 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 ---------------23-11-2004 19:00 23-11-2004 18:50 23-11-2004 18:40 23-11-2004 18:30 23-11-2004 18:20 23-11-2004 18:10 END_T UNDOBLKS TXNCOUNT MAXQUERYLEN ----- ---------- ---------- ----------19:03 332 6231 149 19:00 19 5939 1112 18:50 17 5628 738 18:40 3 5379 298 18:30 13 5056 2 18:20 4 4862 3 73 Monitorowanie wydajności systemu Oracle przy pomocy pakietu STATSPACK 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 RozwaŜania dotyczące wykorzystania urządzeń surowych i macierzy RAID 75 76 Czynniki wpływające na konfigurację systemu dyskowego (1/2) Czynniki wpływające na konfigurację systemu dyskowego (2/2) ♦ Wydajność Odczyty swobodne - istotne dla: zapytań wykorzystujących indeksu i funkcje haszowe oraz odczytów segmentów 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 ścieŜką bezpośrednią, tworzenia przestrzeni tabel Wpływ wpółbieŜności ♦ 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 ♦ Rozproszenie danych między wiele urządzeń dyskowych ♦ Charakterystyka wydajności: Zwiększenie wydajności operacji I/O o 10-15% Swobodne odczyty +++ (jeŜeli 1 I/O mieści się w 1 pasku (ang. ♦ Przeciw Zwiększone zapotrzebowanie na pamięć operacyjną ze strony stripe)) 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) 79 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 -- 80 RAID poziom 1 RAID poziom 1+0 ♦ Lustrzane odbicie dysków bez rozproszenie danych między wiele urządzeń dyskowych ♦ Charakterystyka wydajności: ♦ Lustrzane odbicie dysków z rozproszeniem danych między wiele urządzeń dyskowych ♦ Charakterystyka wydajności: Swobodne odczyty ++ Swobodne zapisy ++ Sekwencyjne odczyty + Sekwencyjne zapisy + Dostępność +++ Koszt zakupu - Koszt utrzymania + 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 + 81 82 Ranking róŜnych poziomów RAID dla poszczególnych plików bazy danych Oracle 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ę w 1 pasku (ang. stripe)) Swobodne zapisy Sekwencyjne odczyty +++ Sekwencyjne zapisy + ⇒ Dostępność ++ Koszt zakupu + Koszt utrzymania + 83 0 1 1+0 3 5 Pliki kontrolne 2 1 2 1 5 3 Pliki dziennika powtórzeń 4 1 5 1 2 3 Przestrzeń 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 Instalacja i deinstalacja pakietu STATSPACK 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. ♦ 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 Przykład instalacji wsadowej ..... 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. SQL> SQL> SQL> SQL> ..... TABLESPACE_NAME -----------------------------SYSTEM USERS RBS TEMP Specify PERFSTAT user's default tablespace Enter value for default_tablespace: users Using users for the default tablespace connect / as sysdba define default_tablespace='users' define temporary_tablespace='temp' @?/rdbms/admin/spcreate Raporty poprawności instalacji ♦ Tworzenie uŜytkownika – spcusr.lis ♦ Tworzenie tabel - spctab.lis ♦ Tworzenie pakietu - spcpkg.lis User altered. User altered. Specify PERFSTAT user's temporary tablespace Enter value for temporary_tablespace: temp User altered. 87 88 Przegląd interfejsu pakietu STATSPACK Parametry procedury SNAP (1) ♦ I_SNAP_LEVEL – poziom szczegółowości zbieranych informacji wydajnościowych, poprawne wartości (domyślnie: 5): ♦ 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 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), 89 90 Parametry procedury MODIFY_STATSPACK_PARAMETER 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) 91 ♦ ♦ ♦ ♦ ♦ ♦ ♦ ♦ ♦ ♦ ♦ 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) 92 Przykłady uŜycia procedury SNAP i MODIFY_STATSPACK_PARAMETER Pomocnicze skrypty Rem jako uŜytkownik PERFSTAT ♦ 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, 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. 93 Przykład zastosowania skryptu SPREPORT SQL> @?\rdbms\admin\spreport 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 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 warto¶ć dla begin_snap: 1 Begin Snapshot Id specified: 1 Podaj warto¶ć dla end_snap: 3 End Snapshot Id specified: 3 Next scheduled run ~~~~~~~~~~~~~~~~~~ The next scheduled run for this job is: 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: Using the report name sp_1_3 ................................... 94 95 JOB NEXT_DAT NEXT_SEC ---------- -------- -------201 02/01/10 16:00:00 96 Przykład zastosowania skryptu SPPURGE (1) 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. Przykład zastosowania skryptu SPPURGE (2) 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 DB Name DB Id Instance Inst Num Release OPS Host ------------ ----------- ------------ -------- ----------- --- -----------ORCL 1 1st 1 7.3.4 0 localhost Zawartość raportu STATSPACK Begin Snap: End Snap: Elapsed: Snap Id Snap Time Sessions ------- ------------------ -------43 05-Gru-01 07:30:21 11 75 05-Gru-01 23:15:47 11 945.43 (mins) Cache Sizes ~~~~~~~~~~~ db_block_buffers: db_block_size: 99 40000 2048 log_buffer: shared_pool_size: 256000 150000000 100 Profil obciąŜenia Load Profile ~~~~~~~~~~~~ Redo size: Logical reads: Block changes: Physical reads: Physical writes: User calls: Parses: Hard parses: Sorts: Logons: Executes: Transactions: % Blocks changed per Read: Rollback per transaction %: Profil obciąŜenia - komentarz Per Second --------------4,304.47 16,613.78 40.62 174.77 8.61 71.12 8.59 Per Transaction --------------13,538.23 52,252.90 127.76 549.69 27.08 223.69 27.01 5.66 0.02 184.45 0.32 17.80 0.08 580.12 0.24 9.61 Recursive Call %: Rows per Sort: ♦ 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: liczby i mocy procesorów, urządzeń I/O, systemu operacyjnego, wersji systemu Oracle, charakteru aplikacji. 80.15 102.83 101 102 Statystyki wydajności i statystyki obszaru współdzielonego 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. Instance Efficiency Percentages (Target 100%) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Buffer Nowait %: 100.00 Redo NoWait %: Buffer Hit %: 98.95 In-memory Sort %: Library Hit %: 99.63 Soft Parse %: Execute to Parse %: 95.34 Latch Hit %: Parse CPU to Parse Elapsd %: 62.44 % Non-Parse CPU: Shared Pool Statistics Memory Usage %: % SQL with executions>1: % Memory for SQL w/exec>1: 103 Begin -----41.34 77.36 72.35 99.99 99.96 99.99 99.99 End -----99.86 50.34 43.35 104 Zdarzenia oczekujące (5 sumarycznie najdłuŜszych) 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 In-memory Sort Soft Parse Latch Hit Non-Parse CPU 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 --------------------------------------------------------------- hard parses, RozwaŜenie hash-join, SORT_AREA_SIZE Problemy z hard parses, CURSOR_SHARING (8.1.6) Patrz: Statystyki wykorzystania zatrzasków Problemy w konstrukcji aplikacji 105 106 Zdarzenia oczekujące – komentarz (1) Zdarzenia oczekujące – komentarz (2) ♦ 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: ♦ 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: 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 107 Za mała liczba buforów danych – DB_BLOCK_BUFFERS, Nieefektywne działanie DBWR, Szczegóły: Statystyki aktywności IO 108 Zdarzenia oczekujące dla procesów serwerów (wszystkie) 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) 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 Time (cs) (ms) /txn ----------- ------ -----612,522 88 3.9 124,301 1 70.6 119,827 2 30.4 50,815 20 1.4 25,764 153 0.1 19,729 8 1.4 15,073 2 4.6 11,427 3 1.9 6,705 87 0.0 3,234 132 0.0 3,089 1471 0.0 Event Waits Timeouts ---------------------------- ------------ ---------latch free 69,829 5,944 db file sequential read 1,272,528 0 db file scattered read 548,320 0 db file parallel write 24,816 187 free buffer waits 1,685 153 log file sync 25,723 110 SQL*Net more data to client 83,516 0 log file parallel write 34,871 0 SQL*Net break/reset to clien 771 0 write complete waits 245 15 enqueue 21 8 ......................... 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 --------------------------------------------------------------- 109 Zdarzenia oczekujące dla procesów drugoplanowych 110 N najbardziej obciąŜających poleceń SQL (wg dostępów do bufora danych) 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 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 N najbardziej obciąŜających poleceń SQL komentarz ♦ Raportowane przy poziomie migawki większym równym 5. ♦ Przydatne do wychwycenia gorących poleceń SQL, które wymagają dodatkowego strojenia. ♦ JeŜeli wąskim gardłem jest: N najbardziej obciąŜających poleceń SQL (wg dostępów do dysku) SQL ordered by Reads for DB: ORCL Instance: 1st -> End Disk Reads Threshold: 1000 Snaps: 43 -75 Physical Reads Executions Reads per Exec % Total Hash Value --------------- ------------ -------------- ------- -----------2,256,386 1,853 1,217.7 22.8 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 ) procesor, to przydatna jest statystyka wg. dostępów do bufora danych, urządzenie I/O, to przydatna jest statystyka wg. dostępów do 2,113,715 117 18,065.9 begin :X0 := DBMS_SQL.EXECUTE(:C); end; dysków, ♦ Niepotrzebne, wielokrotne uruchamianie poleceń SQL moŜna zdiagnozować za pomocą statystyki wg. liczby wykonań. ♦ Pełny tekst polecenia w V$SQL_TEXT wyselekcjonowany za pomocą wartości haszowej (Hash value) 21.3 1541704567 1,955,510 1 1,955,510.0 19.7 471789237 begin FA_PCK_DOK.UKONCZ_GRUPE_DS(472); end; --------------------------------------------------------------- 113 N najbardziej obciąŜających poleceń SQL (wg liczby wykonań) 114 Statystyki aktywności instancji Instance Activity Stats for DB: ORCL SQL ordered by Executions for DB: ORCL -> End Executions Threshold: 100 Instance: 1st Executions Rows Processed Rows per Exec Hash Value ------------ ---------------- ---------------- -----------165,700 165,658 1.0 1333438770 begin aua_pck_prmon.get_msg(:type, :session, :step, :total, :des c); end; 115,143 229,161 2.0 SELECT DST1.DST_LP,DST1.DST_NAZWA,DST1.DST_OPIS CZALNE_STANY DST1 WHERE DST1.DST_KOD = :b1 301386036 FROM NZ_DOPUSZ 114,770 114,770 begin :r:="UL_PCK_PUBLIC"."APPID";end; 282099751 1.0 Instance: 1st Snaps: 43 -75 Snaps: 43 -75 --------------------------------------------------------------- 115 Statistic Total per Second per Trans --------------------------------- ---------------- ------------ -----------background checkpoints completed 54 0.0 0.0 background checkpoints started 54 0.0 0.0 background timeouts 56,229 1.0 3.1 bytes received via SQL*Net from c 182,739,580 3,221.4 10,131.9 bytes sent via SQL*Net to client 631,880,450 11,139.2 35,034.4 calls to get snapshot scn: kcmgss 8,064,383 142.2 447.1 calls to kcmgas 70,781 1.3 3.9 calls to kcmgcs 22,448 0.4 1.2 calls to kcmgrs 8,922,287 157.3 494.7 change write time 8,942 0.2 0.5 cleanouts and rollbacks - consist 204,471 3.6 11.3 cleanouts only - consistent read 11,649 0.2 0.7 cluster key scan block gets 43,392,589 765.0 2,405.9 cluster key scans 4,187,718 73.8 232.2 commit cleanout failures: buffer 12 0.0 0.0 commit cleanout failures: callbac 595 0.0 0.0 commit cleanout number successful 257,179 4.5 14.3 consistent changes 580,477 10.2 32.2 consistent gets 939,040,165 16,554.0 52,064.8 CPU used by this session 2,255,307 39.8 125.0 CPU used when call started 2,255,307 39.8 125.0 ................................. 116 --------------------------------------------------------------- Statystyki aktywności instancji - komentarz Statystyki operacji IO z podziałem na przestrzenie tabel Tablespace IO Stats for DB: ORCL Instance: 1st ->ordered by IOs (Reads + Writes) desc ♦ Pełna lista z V$SYSSTAT, wykorzystywana do: porównania z punktem odniesienia, wyliczenia przydatnych współczynników, np. współczynnik trafień w bufory danych, typowo wykorzystywane statystyki: CPU used by this session, consistent gets, db block gets, enqueue waits, execute count, parse count (total), phisical reads, sorts ♦ Szczegółowy opis statystyk: Oracle8i Reference, dodatek |C: Statistics Descriptions 117 Tablespace -----------------------------Av Av Av Av Buffer Av Buf Reads Reads/s Rd(ms) Blks/Rd Writes Writes/s Waits Wt(ms) -------------- ------- ------ ------- ------------ -------- ---------- -----KG_D 447,429 8 0.6 2.3 4,926 0 0 0.0 NZ_D 445,725 8 1.6 9.5 6,500 0 17 314.7 UL_D 225,336 4 1.4 5.8 61,128 1 3 370.0 FA_D 259,158 5 1.6 8.9 3,052 0 0 0.0 KG_X 101,960 2 2.0 1.4 22,437 0 1 0.0 SYSTEM 108,461 2 1.5 1.8 2,480 0 1 0.0 TEMP 4,028 0 4.1 24.9 82,916 1 0 0.0 UL_X 46,498 1 2.9 1.0 13,546 0 0 0.0 RBS 1,424 0 0.8 1.0 58,050 1 8 451.3 118 ................................................. Statystyki operacji IO z podziałem na pliki danych File IO Stats for DB: ORCL Instance: 1st ->ordered by Tablespace, File 3,477 0 /u01/oradata/DB1/AUA_X01.DBF 2.5 1.0 1,032 0 0 21,494 0 /u01/oradata/DB1/CKK_D01.DBF 1.1 1.5 460 0 1 12,216 0 /u01/oradata/DB1/CKK_X01.DBF 1.8 1.0 1,216 0 0 6,204 0 /u01/oradata/DB1/CSS_D01.DBF 2.3 1.8 150 0 0 CKK_D CKK_X CSS_D Statystyki operacji IO - komentarz Snaps: 43 -75 Tablespace Filename ------------------------ ---------------------------------------------------Av Av Av Av Buffer Av Buf Reads Reads/s Rd(ms) Blks/Rd Writes Writes/s Waits Wt(ms) -------------- ------- ------ ------- ------------ -------- ---------- -----AUA_D /u01/oradata/DB1/AUA_D01.DBF 5,489 0 2.7 1.0 1,042 0 0 AUA_X Snaps: 43 -75 /u01/oradata/DB1/CSS_X01.DBF 1,850 0 3.4 1.0 75 0 .............................................................. 530.0 ♦ UmoŜliwiają zaobserwowanie: Nierównomierności obciąŜenia, Przestrzeni tabel i plików o największej aktywności, Sposobu dostępu: sekwencyjny, swobodny (Avg Blks Rd vs DB_MULTI_BLOCK_READ), Średniego czasu dostępu (Avg Rd (ms)) – nieakceptowane >20ms, Dostępu do przestrzeni tymczasowych – optymalizacja sortowania, Oczekiwania na dostęp do buforów. CSS_X 0 119 120 Statystyki oczekiwań na dostęp buforów danych Buffer wait Statistics for DB: ORCL Instance: 1st -> ordered by wait time desc, waits desc Statystyki oczekiwań na dostęp buforów danych – komentarz (1) Snaps: 43 -75 ♦ Szczegółowy opis zdarzeń: Oracle8i Reference, dodatek A: Oracle Wait Events ♦ Typowe zdarzenia oczekujące na dostęp do buforów danych: free list, data block, index block, undo block, undo header, segment header. Tot Wait Avg Class Waits Time (cs) Time (cs) ------------------ ----------- ---------- --------data block 25 793 32 undo header 7 262 37 undo block 1 99 99 --------------------------------------------------------------- Segment headers – moŜe być spowodowane rywalizacją w dostępie do listy wolnych bloków, zwiększenie ich liczby eliminuje problem. Undo headers – wskazuje na rywalizację w dostępie do tablicy transakcji w segmencie wycofania – za mało segmentów wycofania Freelist block - rywalizacja w dostępie do listy wolnych bloków, zwiększenie ich liczby eliminuje problem. 121 Statystyki oczekiwań na dostęp buforów danych – komentarz (2) 122 Statystyki oczekiwań na dostęp blokad Enqueue activity for DB: ORCL Instance: 1st -> ordered by waits desc, gets desc ♦ W celu identyfikacji obiektu rywalizacji moŜna wykorzystać następujące zapytania: Snaps: 43 -75 Enqueue Gets Waits ---------- ------------ ---------TM 93,293 6 TX 72,186 4 ST 1,564 3 --------------------------------------------------------------- Identyfikacja pliku i bloku: select p1 file, p2 block, p3 reason from v$session_wait where event='buffer busy waits' Identyfikacja segmentu: select distinct owner, segment_name, segment_type from dba_extents where file_id = &file_id and &block_number between block_id and block_id + blokcs +1 123 124 Statystyki oczekiwań na dostęp blokad komentarz Statystyki wykorzystanie segmentów wycofania (1) ♦ Szczegółowy opis blokad: Oracle8i Reference, dodatek B: Oracle Enqueue Names, przykładowe: Rollback Segment Stats for DB: ORCL Instance: 1st Snaps: 43 -75 ->A high value for "Pct Waits" suggests more rollback segments may be required TX – blokada transakcyjna, jeŜeli wyłączna to na poziomie wiersza(y) tabeli, jeŜeli współdzielona (rzadko) najczęściej oznacza rywalizację o Interest Transaction List, sposób ustalenia: select chr(bitand(p1,-16777216)/16777215)|| chr(bitand(p1,16711680)/65535) "enqueque type", decode(bitand(p1, 65535), 4, 'S', 6, 'X', to_char(bitand(p1, 65535)) )"mode", from v$session_wait where event ='enqueue' TM – blokada transakcyjna na poziomie tabeli, moŜliwy brak indeksu na polach klucza obcego, ST – blokady zarządzania przestrzenia danych, unikanie: stosowanie tymczasowej przestrzeni TEMPORARY (zamiast PERMANENT), specyfikowanie adekwatnej klauzuli STORAGE, stosowanie jednolitych rozszerzeń w lokalnie zarządzanych przestrzeniach tabel (Oracle8i) Trans Table Pct Undo Bytes RBS No Gets Waits Written Wraps Shrinks Extends ------ ------------ ------- --------------- -------- -------- -------0 225.0 0.00 0 0 0 0 1 14,835.0 0.00 7,298,611 8 0 0 2 12,933.0 0.00 6,651,040 8 0 0 3 18,816.0 0.00 7,721,553 9 0 0 4 15,232.0 0.00 8,392,405 10 0 0 5 14,079.0 0.00 6,414,843 8 0 0 6 17,926.0 0.00 9,424,918 10 0 0 7 15,397.0 0.00 6,701,375 8 0 0 8 31,319.0 0.00 13,028,623 14 0 0 9 14,042.0 0.00 6,511,579 8 0 0 10 9,617.0 0.00 5,149,718 6 0 0 11 19,548.0 0.00 10,136,571 11 0 0 12 12,488.0 0.00 5,357,546 6 0 0 --------------------------------------------------------------- 125 Statystyki wykorzystanie segmentów wycofania (2) Rollback Segment Storage for DB: ORCL Instance: 1st ->Optimal Size should be larger than Avg Active 126 Statystyki wykorzystanie segmentów wycofania - komentarz Snaps: 43 -75 ♦ Dla segmentów wycofania krytyczne parametry to: Pct Waits – jeŜeli przekracza 1% to naleŜy zwiększyć liczbę RBS No Segment Size Avg Active Optimal Size Maximum Size ------ --------------- --------------- --------------- --------------0 202,752 0 202,752 1 65,384,448 600,696 65,384,448 2 69,572,608 599,905 69,572,608 3 22,116,352 644,833 22,116,352 4 61,114,368 755,280 61,114,368 5 53,721,088 599,816 53,721,088 6 25,280,512 798,745 25,280,512 7 69,529,600 599,834 69,529,600 8 60,217,344 2,740,291 60,217,344 9 20,037,632 600,696 20,037,632 10 75,851,776 493,794 75,851,776 11 103,243,776 885,645 103,243,776 12 47,460,352 494,197 47,460,352 --------------------------------------------------------------- 127 segmentów wycofania: • 4 sesje OLTP na jeden segment wycofania, • 1 zadania wsadowe na jeden segmetn wycofania, Optimal Size – wartość powinna być większa Avg Active, minimalizując liczbę rozszerzeń (Extends) i skurczeń (Shrinks) oraz maksymalizując średnią wielkość zwolnionego obszaru. 128 Statystyki aktywności zatrzasków (2) Statystyki aktywności zatrzasków (1) Latch Sleep breakdown for DB: ORCL -> ordered by misses desc Latch Activity for DB: ORCL Instance: 1st Snaps: 43 -75 ->"Get Requests", "Pct Get Miss" and "Avg Slps/Miss" are statistics for willing-to-wait latch get requests ->"NoWait Requests", "Pct NoWait Miss" are for no-wait latch get requests ->"Pct Misses" for both should be very close to 0.0 Pct Avg Pct Get Get Slps NoWait NoWait Latch Name Requests Miss /Miss Requests Miss ----------------------------- -------------- ------ ------ ------------ -----cache buffer handles 94,247 0.0 0 cache buffers chains 1,500,953,423 0.0 0.8 28,635,475 1.2 cache buffers lru chain 11,907,107 0.0 0.6 11,881,845 0.1 dml lock allocation 186,604 0.0 0 enqueue hash chains 370,038 0.0 1.0 0 enqueues 476,116 0.0 0.0 0 ktm global data 190 0.0 0 latch wait list 127,834 0.0 0.2 0 library cache 52,338,856 0.1 0.9 15,456 0.1 library cache load lock 7,558 0.0 0 list of block allocation 152,621 0.0 1.0 0 loader state object freelist 126 0.0 0 messages 1,028,379 0.0 0.3 0 modify parameter values 1,374 0.0 0 .................................................... 129 --------------------------------------------------------------- Latch Name -----------------------cache buffers chains cache buffers chains cache buffers chains cache buffers chains cache buffers chains cache buffers chains cache buffers chains cache buffers chains cache buffers chains cache buffers chains cache buffers chains Snaps: 43 -75 Get Spin & Latch Name Requests Misses Sleeps Sleeps 1->4 -------------------------- -------------- ----------- ----------- -----------library cache 52,338,856 70,990 63,743 15231/49656/ 4437/1666/0 cache buffers lru chain 11,907,107 4,876 2,802 2089/2772/15 /0/0 cache buffers chains 1,500,953,423 3,131 2,422 732/2376/23/ 0/0 system commit number 9,532,978 1,008 218 790/218/0/0/ 0 messages 1,028,379 471 157 315/155/1/0/ 0 session idle bit 8,150,478 326 44 282/44/0/0/0 redo allocation 1,460,798 263 92 171/92/0/0/0 shared pool 2,287,856 226 187 51/163/12/0/ 0 row cache objects 3,174,474 107 88 19/88/0/0/0 redo copy 66 64 57 8/55/1/0/0 latch wait list 127,834 44 7 37/7/0/0/0 multiblock read objects 1,240,240 12 3 9/3/0/0/0 session allocation 1,302,406 10 5 5/5/0/0/0 ................................. 130 Statystyki aktywności zatrzasków (3) – dla asysty technicznej Oracle Latch Miss Sources for DB: ORCL Instance: 1st -> only latches with sleeps are shown -> ordered by name, sleeps desc Instance: 1st Statystyki aktywności zatrzasków komentarz Snaps: 43 -75 ♦ Rywalizacja o zatrzaski moŜe być symptomem innych problemów, przykładowo: NoWait Waiter Where Misses Sleeps Sleeps -------------------------- ------- ---------- ------kcbgtcr: kslbegin ####### 1,824 0 kcbzgb: single set 3,497 1,510 0 kcbzib: multi-block read: 13,007 212 0 kcbrls: kslbegin 138 130 0 kcbzar: KSLNBEGIN 1,567 109 0 kcbchg: kslbegin: bufs not ####### 54 0 kcbzgb: scan from tail. no 0 51 0 kcbget: in dead retry 13 50 0 kcbibr 0 48 0 kcbdrd 2 15 0 kcbbxsv: get DBA 0 13 0 Rywalizacja o zatrzaski obszaru bibliotecznego i obszaru słownikowego jest często spowodowana: • niepotrzebnym parsingiem, • duŜą liczba dołączeń i rozłączeń generowanych przez warstwę pośrednią (middleware), • przeładowywaniem duŜych obiektów PL/SQL ♦ Rywalizacja o zatrzaski moŜe być spowodowana niewystarczającą ilością zasobów, przykładowo: w przypadku rywalizacji o zatrzask bufora danych cache buffers lru chain moŜna ustawić DB_LRU_LATCHES=liczba procesorów w przypadku rywalizacji o zatrzask bufora dziennika powtórzeń redo 131 allocation moŜna moŜna zmniejszyć parametr LOG_SMALL_ENTRY_MAX_SIZE w przypadku rywalizacji o zatrzask bufora dziennika powtórzeń redo copy moŜna ustawić LOG_SIMULTANOUS=2 x liczba procesorów 132 Statystyki buforów słownika danych komentarz Statystyki buforów słownika danych Dictionary Cache Stats ->"Pct Misses" should ->"Cache Usage" is the ->"Pct SGA" is the for DB: ORCL Instance: 1st Snaps: 43 -75 be very low (< 2% in most cases) number of cache entries being used ratio of usage to allocated size for that cache ♦ Krytyczne wskaźniki to: Get Pct Scan Pct Mod Final Pct Cache Requests Miss Requests Miss Req Usage SGA ---------------------- ------------ ------ -------- ----- -------- ------ ---dc_column_grants 0 0 0 0 0 dc_columns 2,579,683 0.4 70,141 1.3 12 ###### 100 dc_constraint_defs 104,428 1.8 7,405 3.6 0 2,257 100 dc_constraints 0 0 0 0 0 dc_database_links 0 0 0 0 0 dc_files 26 19.2 0 13 5 42 dc_free_extents 4,918 36.0 1,445 0.0 2,890 370 99 dc_histogram_data 0 0 0 0 0 dc_histogram_defs 4,424 6.4 0 0 302 96 dc_indexes 151,145 0.9 35,346 1.4 0 1,358 99 dc_object_ids 236,274 0.5 0 0 1,471 99 dc_objects 58,426 8.8 0 67 5,598 100 dc_profiles 0 0 0 0 0 dc_rollback_segments 6,478 0.0 0 0 18 75 dc_segments 133,233 1.0 0 1,416 1,642 100 dc_sequence_grants 464 22.6 0 0 43 30 dc_sequences 46,625 0.1 0 46,091 68 92 dc_synonyms 21,383 12.3 0 26 2,768 100 133 ................................... Statystyki obszaru współdzielonego SQL (obszaru bibliotecznego) Library Cache Activity for DB: ORCL ->"Pct Misses" should be very low Instance: 1st Współczynnik trafień dla operacji Get i Scan – powinien być większy od 98% W przypadku problemów moŜna zwiększyć wartość parametru SHARED_AREA_SIZE 134 Statystyki obszaru współdzielonego SQL (obszaru bibliotecznego) - komentarz ♦ Krytyczne wskaźniki to: Snaps: 43 -75 Get Pct Pin Pct InvaliNamespace Requests Miss Requests Miss Reloads dations --------------- ------------ ------ -------------- ------ ---------- -------SQL AREA 515,044 3.6 11,641,213 0.7 45,477 95 TABLE/PROCEDURE 105,103 4.9 9,814,926 0.0 224 0 BODY 3,886 3.9 3,886 3.9 1 0 TRIGGER 9,609 0.1 9,609 0.2 2 0 INDEX 0 0 0 0 CLUSTER 0 0 0 0 OBJECT 0 0 0 0 PIPE 527,345 0.1 527,344 0.1 99 0 --------------------------------------------------------------- Reloads – duŜa wartość oznacza intensywne wymiatanie 135 współdzielonych danych, środki zaradcze: • Zwiększenie obszaru współdzielonego – SHARED_AREA_SIZE, • Zmiana wielkości obszaru dla duŜych obiektów – SHARED_POOL_RESERVED_SIZE • Przypięcie często uŜywanych obiektów np.: pakiet SYS.STANDARD – DBMS_POOL Get Requests i Pin Requests – współczynnik trafień powinien być większy od 1% - środki zaradcze : rekonstrukcja aplikacji aby współdzieliły polecenia SQL (np.: unikanie prywatnych synonimów) Invalidations – duŜa liczba moŜe wskazywać na wykonywanie operacji DDL 136 Wielkość obszarów pamięci SGA (1) Wielkość obszarów pamięci SGA (2) SGA breakdown difference for DB: ORCL SGA Memory Summary for DB: ORCL Instance: 1st Snaps: 43 -75 SGA regions Size in Bytes ------------------------------ ---------------Database Buffers 81,920,000 Fixed Size 41,880 Redo Buffers 256,000 Variable Size 159,973,444 ---------------sum 242,191,324 --------------------------------------------------------------- 137 Instance: 1st Snaps: 43 -75 Pool Name Begin value End value Difference ----------- ------------------------ -------------- -------------- ----------0 character set memory 33,620 33,620 0 0 db_block_buffers 81,920,000 81,920,000 0 0 db_block_hash_buckets 7,018,016 7,018,016 0 0 db_block_multiple_hashch 1,641,148 1,641,148 0 0 db_files 87,848 87,848 0 0 dictionary cache 1,112,192 7,776,860 6,664,668 0 distributed_transactions 20,608 20,608 0 0 DML locks 54,000 54,000 0 0 enqueue_locks 148,512 148,512 0 0 enqueue_resources 37,440 37,440 0 0 event statistics 214,200 214,200 0 0 fixed allocation callbac 512 512 0 0 fixed_sga 41,880 41,880 0 0 free memory 142,076,376 350,484 ########### 0 gc_* 73,564 73,564 0 0 ktlbk state objects 50,116 50,116 0 0 latch nowait fails or sl 10,320 10,320 0 0 LCCMD SGA Table 13,676 13,676 0 0 library cache 1,839,596 47,010,104 45,170,508 0 log_buffer 256,000 256,000 0 0 messages 59,200 59,200 0 ....................................... 138 Niedomyślne wartości parametrów init<SID>.ora Wielkość obszarów pamięci SGA komentarz init.ora Parameters for DB: ORCL ♦ UmoŜliwia monitorowanie alokacji pamięci SGA na poszczególne zasoby ♦ Przydatne do określenia gorących zasobów instancji bazy danych Instance: 1st Snaps: 43 -75 End value Parameter Name Begin value (if different) ----------------------------- --------------------------------- -------------processes 150 sessions 170 timed_statistics TRUE cpu_count 2 shared_pool_size 150000000 enqueue_resources 520 control_files /u01/oradata/DB1/control01.ctl, / db_block_buffers 40000 db_block_size 2048 db_block_lru_latches 1 compatible 7.3.3.0 log_buffer 256000 log_checkpoint_interval 10000 log_simultaneous_copies 2 db_files 200 db_file_multiblock_read_count 32 gc_releasable_locks 40000 gc_freelist_groups 50 checkpoint_process TRUE ................................ 139 140 Niedomyślne wartości parametrów komentarz ♦ Przydatne do monitorowania zmian parametrów pracy instancji ♦ UmoŜliwia wychwycenie nietypowych ustawień Tworzenie własnych raportów 141 142 Tabele STAT$ i odpowiednie perspektywy V$ (1) Tworzenie własnych raportów - wstęp ♦ NaleŜy wykorzystać informacje składowane w tabelach STATS$ uŜytkownika PERFSTAT. ♦ Schemat tych tabel oparty jest na wybranych dynamicznych perspektywach V$ (np.: V$LATCH). ♦ Ich opis moŜna znaleźć w: Oracle8i Reference Rozdział3: Dynamic Performance (V$) Views ♦ Informacje o wykonanych migawkach (np.: dacie i czasie) znajdują się w tabeli STATS$SNAPSHOT. ♦ Kluczem połączeniowym między STATS$SNAPSHOT a pozostałymi tabelami STATS$ są atrybuty: SNAP_ID, DBID, INSTANCE_NUMBER. 143 ♦ ♦ ♦ ♦ ♦ ♦ ♦ ♦ ♦ ♦ ♦ ♦ ♦ ♦ ♦ ♦ stats$bg_event_summary stats$buffer_pool_statistics stats$database_instance stats$enqueuestat stats$filestatxs stats$idle_event stats$latch stats$latch_children stats$latch_misses_summary stats$latch_parent stats$level_description stats$librarycache stats$parameter stats$rollstat stats$rowcache_summary stats$session_event ♦ ♦ ♦ ♦ ♦ ♦ ♦ ♦ ♦ ♦ ♦ ♦ ♦ ♦ ♦ ♦ v$system_event v$buffer_pool_statistics v$database v$instance x$ksqst (nieudokumentowana) v$filestat (wersja rozszerzona) Katalog zdarzeń typu IDLE v$latch v$latch_children v$latch_misses v$latch_parent Opis poziomów dla procedury SNAP v$librarycache v$parameter v$rollstat v$rowcache v$session_event 144 Tabele STAT$ i odpowiednie perspektywy V$ (2) ♦ ♦ ♦ ♦ ♦ ♦ ♦ ♦ ♦ ♦ ♦ ♦ stats$sesstat stats$sga stats$sgastat stats$snapshot stats$sql_statistics stats$sql_summary stats$sqltext stats$statspack_parameter stats$sysstat stats$system_event stats$tempstatxs stats$waitstat ♦ ♦ ♦ ♦ ♦ ♦ ♦ ♦ ♦ ♦ ♦ ♦ Przykładowe zapytanie generujące plik tekstowy ze statystykami (1) v$sesstat v$sga v$sgastat Opis migawek v$sql V$sql v$sqltext Wart. dom. param. proc. SNAP v$sysstat v$system_event v$tempstat (wersja rozszerzona) v$waitstat 145 select 'Time' ||chr(9)||'Redo size/s'||chr(9)||'Redo size/t' ||chr(9)||'Logical reads/s'||chr(9)||'Logical reads/t' ||chr(9)||'Block changes/s'||chr(9)||'Block changes/t' ||chr(9)||'Physical reads/s'||chr(9)||'Physical reads/t' ||chr(9)||'Physical writes/s'||chr(9)||'Physical writes/t' || ... from dual; 146 Procedura gen_tmp_load Przykładowe zapytanie generujące plik tekstowy ze statystykami (2) exec gen_tmp_load(to_date(:dzien, 'dd-mm-yyyy')) select to_char(edate,'HH24:MI')||chr(9)|| p1 ||chr(9)|| p2 ||chr(9)|| p3 ||chr(9)|| p4 p6 ||chr(9)|| p7 ||chr(9)|| p8 ||chr(9)|| p9 p11 ||chr(9)|| p12 ||chr(9)|| p13 ||chr(9)|| p16 ||chr(9)|| p17 ||chr(9)|| p18 ||chr(9)|| p21 ||chr(9)|| p22 ||chr(9)|| p23 ||chr(9)|| p26 ||chr(9)|| p27 from tmp_load_stat order by eid; undefine dzien prompt Podaj dzien (dd-mm-yyyy) variable dzien varchar2(20); begin :dzien := '&&dzien'; end; / SET NEWPAGE 0 SPACE 0 PAGESIZE 0 ECHO OFF FEEDBACK OFF HEADING OFF set trimspool on trimout on; set linesize 500 spool &&dzien.load.txt ||chr(9)|| p5 ||chr(9)|| ||chr(9)|| p10 ||chr(9)|| p14 ||chr(9)|| p15||chr(9)|| p19 ||chr(9)|| p20||chr(9)|| p24 ||chr(9)|| p25||chr(9)|| spool off 147 create or replace procedure gen_tmp_load (dzien date) is gets number; phyr number; tran number; ... begin for snapy in ( select b.SNAP_ID bid, e.SNAP_ID eid, b.DBID DBID, b.INSTANCE_NUMBER INST_NUM, round(((e.snap_time - b.snap_time) * 1440 * 60), 0) ela, e.SNAP_TIME SNAP_TIME from STATS$SNAPSHOT b, STATS$SNAPSHOT e where e.SNAP_ID=b.SNAP_ID+1 and b.dbid = e.dbid and b.instance_number = e.instance_number and e.snap_time between dzien+8/24 and dzien+1 ) loop STATSPACK.STAT_CHANGES ( snapy.bid, snapy.eid , snapy.dbid, snapy.inst_num -- End of IN arguments , gets, phyr , tran, ....................... ); insert into tmp_load_stat values( snapy.eid , snapy.SNAP_TIME , round(gets/snapy.ela,2), round(gets/tran,2) -- Logical reads , round(phyr/snapy.ela,2), round(phyr/tran,2) -- Physical reads ....................... ); end; / 148 Wykres po imporcie pliku wynikowego do Excela Literatura 100000 ♦ ♦ ♦ ♦ 10000 1000 Redo size/s Logical reads/s Block changes/s Physical reads/s 100 Physical writes/s Sorts/s Rollback per transaction % Rows per Sort 10 Oracle8i Designing and Tuning for Performance Part No. A76992-01 Oracle8i Reference Part No. A76961-01 $ORACLE_HOME/rdbms/admin/spdoc.txt Performance Tuning with Statspack, Part I and II – Oracle Technical White Paper – July 2000 ♦ Performance Tunig with Statspack, C. Dialeris, G. Wood - Oracle Magazine Sept 2000 ♦ Oracle Database Trend Analysis Using STATSPACK - Oracle Magazine 2000 22 :4 5 21 :4 4 20 :4 4 19 :4 3 17 :4 1 18 :4 2 16 :4 1 15 :4 0 15 :0 4 14 :0 3 13 :0 2 12 :0 2 11 :0 1 9: 00 10 :0 0 8: 00 1 0,1 149 150