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

Podobne dokumenty