Część techniczna

Alokacja pamięci (1/3)


Krzysztof Mikołajczyk


Jednym z elementów strojenia bazy danych jest odpowiednia alokacja pamięci dla różnych struktur bazy. W dzisiejszym odcinku zostaną omówione struktury pamięci, jakie występują w wersjach 6 i 7 bazy Oracle, natomiast w następnych dwóch sposób obserwacji i strojenia (w drugim dla wersji 6, w trzecim dla wersji 7).


Struktura obszaru pamięci w wersji 7 różni się od wersji 6. Pewne składniki pamięci występują zarówno w wersji 6, jak i 7, jednak ich obsługa wygląda nieco inaczej. Z tego względu składniki pamięci zostaną omówione niezależnie dla obu wersji.

Wersja 6


Poniższy rysunek przedstawia przydział pamięci dla różnych procesów przez system operacyjny (rysunek nie zawiera właściwych proporcji).
Strojenie obszarów pamięci odbywa się głównie za pośrednictwem parametrów pliku startowego bazy initSID.ora.
W wersji 6 strojeniu podlegają następujące elementy:

  • Obszar kontekstu

    • zawiera aktualnie przetwarzane polecenie SQL; każdy proces użytkownika może zawierać kilka obszarów kontekstu (maksymalnie OPEN_CURSORS).


Obszar kontekstu zawiera niezbędne informacje do wykonania polecenia SQL:

  1. oryginalny tekst polecenia SQL,
  2. przetłumaczony tekst polecenia (niezbędne są informacje o obiektach występujących w poleceniu),
  3. jeden wiersz wyniku,
  4. status kursora,
  5. dodatkowe informacje używane przy sortowaniu.

Czas potrzebny na uzyskanie powyższych informacji może być znaczący, w szczególności, gdy to samo polecenie jest wykonywane wielokrotnie. Dlatego dla niektórych poleceń opłaca się zatrzymać te informacje w pamięci (w obszarze kontekstu). W pliku initSID.ora można ustawić trzy parametry dotyczące tego obszaru – CONTEXT_AREA, CONTEXT_INCR i OPEN_CURSORS.

  • Bufory słownika danych

    • zawierają informacje na temat obiektów bazy danych (tabel, indeksów, przestrzeni tabel, kolumn itd); jest to pierwsze miejsce, gdzie system szuka informacji o tych obiektach.


Obszar buforów słownika jest podzielony na podobszary dla każdego rodzaju obiektu – dla tabel, klasterów, indeksów, synonimów, kolumn, użytkowników itp. Wielkość każdego podobszaru jest określona przez specjalny parametr pliku initSID.ora. Parametry te mają przedrostek DC_, a następnie nazwę podobszaru (np. DC_TABLES, DC_COLUMNS).

  • Bufory danych

    • zawierają kopie bloków danych (tabel, klastrów, indeksów, segmentów wycofania itd); jest to największy fragment SGA.


W buforach tych trzymane są kopie danych z bazy. Generalnie im większy jest ten obszar, tym więcej danych znajduje się w pamięci, a co za tym idzie wydajność systemu jest większa (ale nie należy przesadzać z powiększaniem tego obszaru – o tym w następnym odcinku). Wielkość obszaru buforów danych jest określona przez parametr DB_BLOCK_BUFFERS.

  • Bufory dziennika powtórzeń

    • zawierają dane zapisywane do dziennika powtórzeń.


Informacje zapisane w tych buforach dotyczą zmian dokonywanych przez użytkowników bazy. Zatwierdzenie zmian przez użytkownika lub zapełnienie tych buforów powoduje, że proces LGWR przepisuje je na dysk do pliku dziennika powtórzeń. Parametr initSID.ora LOG_BUFFER decyduje o wielkości tego obszaru.

Wersja 7


Poniższy rysunek przedstawia przydział pamięci dla różnych procesów przez system operacyjny (rysunek nie zawiera właściwych proporcji).


Strojenie obszarów pamięci odbywa się głównie za pośrednictwem parametrów pliku startowego bazy initSID.ora.


W wersji 7 strojeniu podlegają następujące elementy:


  • Obszar prywatny SQL

    • zawiera przetwarzane polecenie SQL lub PL/SQL, które nie jest dzielone; występuje w obszarze buforów wspólnych w SGA przy pracy z serwerem wielowątkowym, w przeciwnym przypadku jest umieszczany w obszarze prywatnym użytkownika.


Informacje zawarte w tym obszarze odpowiadają obszarowi kontekstu z wersji 6. Ilość prywatnych obszarów SQL jest określona przez parametr OPEN_CURSORS.

  • Obszar wspólny (Shared Buffer Pool)

    • zawiera informacje na temat obiektów bazy danych (ten fragment jest odpowiednikiem buforów słownika danych); zawiera elementy współdzielonych poleceń SQL; zawiera informacje o sesji.


Obszar ten jest połączeniem buforów słownika danych, obszarów kontekstu wspólnych dla kilku użytkowników oraz dodatkowych informacji na temat sesji (w przypadku serwera wielowątkowego). Wielkość całego obszaru określa parametr SHARED_POOL_SIZE.

  • Bufory danych

    • zawierają kopie bloków danych (tabel, klasterów, indeksów, segmentów wycofania itd);

      jest to największy fragment SGA.


W buforach tych trzymane są kopie danych z bazy. Generalnie im większy jest ten obszar, tym więcej danych znajduje się w pamięci, a co za tym idzie wydajność systemu jest większa (ale nie należy przesadzać z powiększaniem tego obszaru – o tym w następnym odcinku). Wielkość obszaru buforów danych jest określona przez parametr DB_BLOCK_BUFFERS. Jest to taki sam obszar jak w wersji 6.

  • Bufory dziennika powtórzeń

    • zawierają dane zapisywane do dziennika powtórzeń.


Informacje zapisane w tych buforach dotyczą zmian dokonywanych przez użytkowników bazy. Zatwierdzenie zmian przez użytkownika lub zapełnienie tych buforów powoduje, że proces LGWR przepisuje je na dysk do pliku dziennika powtórzeń. Parametr initSID.ora LOG_BUFFER decyduje o wielkości tego obszaru. Jest to taki sam obszar jak w wersji 6.


Rysunki poniżej przedstawiają przydział pamięci dla różnych procesów przez system operacyjny.


Rysunki nie zawieraja własciwych proporcji.


Pamięć dla systemu Oracle 6Pamięć dla systemu Oracle 7



Jądro systemu operacyjnego

Pamięć rezerwowana dla potrzeb
systemu operacyjnego

Jądro ORACLE i jego procesy

Obszar globalny systemu (SGA)




Bufory słownika danych

Bufory dziennika powtórzeń

Bufory danych


Pamięć użytkownika (Oracle)




Obszar kontekstu

Dane






Pamięć użytkownika (Oracle)




Obszar kontekstu

Dane






Pamięć użytkownika




Dane


Obszar wolny




Jądro systemu operacyjnego

Pamięć rezerwowana dla potrzeb
systemu operacyjnego

Jądro ORACLE i jego procesy

Obszar globalny systemu (SGA)




Bufory obszaru wspólnego

Bufory dziennika powtórzeń

Bufory danych

Obszar prywatny SQL


Pamięć użytkownika (Oracle)




Obszar kontekstu

Dane






Pamięć użytkownika (Oracle)




Obszar kontekstu

Dane






Pamięć użytkownika




Dane


Obszar wolny