ZaDBAny kacik

W dzisiejszym kąciku kolejny odcinek strojenia bazy danych. Dotyczy on dostępu do dysków. Jak wiadomo, najlepszą metodą poprawy wydajności dysków jest zastosowanie większej liczby dysków (nowszych), jak również podłączenie ich do większej liczby kontrolerów. Problem tylko w tym, że to kosztuje. I to nawet sporo, pomimo spadających cen.
Dlatego zawsze przed zainwestowaniem w nowy sprzęt należy sprawdzić, czy można poprawić wydajność systemu bez dodatkowych inwestycji. Proszę również pamiętać, że podłączenie do jednego kontrolera dwóch urządzeń o różnych parametrach może spowodować wykorzystanie tylko fragmentu możliwości lepszego urządzenia. Jeśli podłączymy bardzo nowy i szybki dysk (który może być dość drogi) do tego samego kontrolera, co 2-krotny CD-ROM, to szybki (i drogi) dysk będzie oczekiwał na dostęp do szyny danych akurat zajętej przez CD-ROM (o ile korzystamy równolegle z obu napędów).
W następnym odcinku znajdzie się podsumowanie strojenia bazy z wieloma przykładami, a także z zadaniami do samodzielnego wykonania (jeszcze nie wiem, czy do tych zadań pojawią się odpowiedzi). Zajmiemy się również przygotowaniem do odtwarzania bazy po awarii.

Krzysztof Mikołajczyk


Dostęp do dysków

Krzysztof Mikołajczyk

Kolejnym elementem strojenia bazy danych jest odpowiednie zminimalizowanie i rozłożenie ruchu na poszczególne dyski. Krok ten należy wykonywać po strojeniu alokacji pamięci z dwóch powodów. Pierwszym jest to, że małe zmiany w alokacji pamięci mogą spowodować duże zmiany w liczbie czytanych i pisanych na dyski bloków. Drugim powodem są korzyści, jakie możemy uzyskać – są one zdecydowanie większe dla alokacji pamięci.

Podczas strojenia należy pamiętać o kilku sprawach. Oprócz strojonej bazy w danym systemie może pracować również wiele innych aplikacji (również baz), które generują dostęp do dysku. W związku z tym przy ocenie ilości czytań i pisań należy w pierwszej kolejności używać narzędzi systemu operacyjnego. Druga sprawa to same dyski.Jeżeli dysponujemy jednakowymi dyskami, to sprawa jest prostsza – należy na ogół dążyć do zrównoważenia
obciążenia dysków (chyba, że niektóre aplikacje są mniej istotne – wtedy można je „poświęcić”
i umieścić na bardziej obciążonym dysku, ale nie umieszczać tam plików naszej bazy). W przypadku dysków
różnych (o różnych czasach dostępu i różnej przepustowości) sprawa się nieco komplikuje. W tym wypadku należy starać się o uzyskanie transferu na dyskach poniżej ich granicznych wartości (jeśli na wszystkich dyskach osiągamy wartości maksymalne, to mamy trzy możliwości – wymienić niektóre dyski,
dołożyć nowe dyski lub powrócić do strojenia alokacji pamięci).
Przy strojeniu aktywności dysków skupimy się na:

  • zmniejszeniu sporów przy dostępie do dysków,
  • odpowiednim zaalokowaniu przestrzeni w blokach,
  • unikaniu dynamicznego zarządzania przestrzenią.

Do pomiaru aktywności dysków (na poziomie bazy danych) będziemy używać podprogramu MONITOR z programu SQLDBA. Do wyświetlenia ruchu użyjemy opcji FILES:
SQLDBA> MONITOR FILES

Patrząc na wydruk trzeba zwrócić uwagę na to, że jest to podział na pliki bazy danych, a nie na dyski, jak również na brak w wydruku plików dziennika powtórzeń.

  • jeśli „Request Rate Read/s” jest duże, to występuje wiele czytań z danego pliku,
  • jeśli „Request Rate Write/s” jest duże, to występuje wiele pisań do danego pliku,
  • „Request Rate Write/s * Batch Size blks/w” oznacza całkowitą ilość bloków zapisanych na sekundę

W przypadku, gdy mamy kilka plików na jednym dysku, powyższe wartości należy zsumować. Gdy dla któregoś dysku zostanie osiągnięta wartość graniczna, należy dokonać pewnych modyfikacji:

  • przeniesienie niektórych plików na inny dysk (może być konieczne podzielenie przestrzeni tabel na
    kilka plików),
  • zamiana miejscami wybranych plików (uwaga na obciążenie na poziomie systemu operacyjnego)
  • należy pamiętać o rozdzieleniu tabel i indeksów na różne dyski
  • należy pamiętać o rozłożeniu dużych tabel na różne dyski
  • zwiększenie ilości buforów danych w SGA (jeśli jest wystarczająco pamięci operacyjnej)

Dzięki rozmieszczaniu dużych tabel i indeksów na kilku dyskach możemy uzyskać zrównoważony dostęp do danych bez konfliktów pomiędzy użytkownikami. Pociąga to za sobą utworzenie nowej przestrzeni tabel do tego celu. Przestrzeń tworzymy z tylu plików, na ile dysków chcemy je rozłożyć.

SQL> CREATE TABLESPACE ts
DATAFILE '/baza/dbs1.dbf' SIZE 260k;
SQL> ALTER TABLESPACE ts
ADD DATAFILE '/baza/dbs2.dbf' SIZE 260k;
SQL> CREATE TABLE tab(
kol1 number,
kol2 char(40))
TABLESPACE ts
STORAGE
(INITIAL 250k
NEXT 250k
MINEXTENTS 2
PCTINCREASE 0);

Przy wprowadzaniu danych do takiej tabeli należy pamiętać o odpowiednim ich rozmieszczeniu w poszczególnych plikach.

Alokacja przestrzeni w blokach

Dzięki odpowiedniej alokacji przestrzeni w blokach możemy zmniejszyć ilość odczytów z dysku dla niektórych zapytań. Uzyskamy to za pomocą odpowiedniego ustawiania parametrów PCTFREE i PCTUSED. Oba te parametry mają znaczenie tylko dla nowo alokowanych bloków. Parametr PCTFREE powinien być tak dobrany, aby zredukować możliwość przenoszenia części wiersza do drugiego bloku. Jeżeli przy uaktualnianiu wiersza jego rozmiar będzie większy od pozostałego wolnego miejsca, to nastąpi "przenoszenie wierszy" (chaining). Zjawisko to jest bardzo niekorzystne, szczególnie gdy do
sięgnięcia do danych używamy indeksu - indeks może wskazywać inny blok, niż ten który rzeczywiście
zawiera dane. Niestety, nie istnieje pewna metoda na wykrycie tego zjawiska - występuje ono, gdy suma bajtów danych i kontrolnych zawartych w danym bloku jest większa od wielkości tego bloku. W przeciwnym wypadku nic nie wiadomo.
Małe PCTFREE daje nam lepsze wykorzystanie przestrzeni (więcej wierszy mieści się w bloku), ale mamy mniej miejsca na ewentualne powiększanie wierszy (groźba przenoszenia wierszy).
Duże PCTFREE daje gorsze wykorzystanie przestrzeni (w każdym bloku zostaje więcej wolnego miejsca, być może nigdy nie wykorzystanego), ale jest więcej miejsca na ewentualne powiększenie wiersza (mniejsze prawdopodobieństwo wystąpienia łączenia). Mamy także więcej miejsca na zapis o transakcjach sięgających do danego bloku (dzięki czemu większa ilość transakcji może być obsłużona równocześnie).
Ostatnim elementem, na który powinniśmy zwrócić uwagę, to dynamiczne rozszerzanie przestrzeni. Powoduje ono niepotrzebne odwołania do dysku i nieoptymalną alokację obszarów dla poszczególnych obiektów (nie ma ciągłości obszarów w segmencie, przez co nie można w pełni wykorzystać czytania wieloblokowego). Jeśli segmenty złożone z wielu obszarów zmodyfikujemy tak, że będą one składać się z jednego obszaru, to dzięki temu możemy zaoszczędzić na aktywności dysków. Taka reorganizacja może nam pozwolić również na modyfikację parametru PCTFREE.
W celu reorganizacji
musimy wykonać następujące kroki:

  1. Wyeksportuj tabelę.
  2. Usuń tabelę.
  3. Utwórz nową tabelę (pamiętaj o podaniu właściwych parametrów alokacji).
  4. Zaimportuj tabelę.

Jeśli w bazie jest dostateczna ilość wolnej przestrzeni, to powyższe zadanie można również wykonać poprzez przekopiowanie danych z jednej tabeli do drugiej.