|
![]() |
|
![]() |
|
|
szukaj w serwisie
![]() |
![]() |
|
![]() |
|
||||||||||
|
||||||||||||||
|
![]() |
Kalibrowanie systemu przy użyciu DBMS_STATSPaweł Barut Autor jest projektantem systemów bazodanowych. Posiada tytuł Oracle Certified Professional DBA 8 oraz 9i, a także wieloletnie praktyczne doświadczenie z bazami danych Oracle. Najważniejszym modułem bazy danych Oracle jest silnik wykonujący zapytania SQL. Sercem motoru SQL jest optymalizator planu wykonania. W przeszłości był to optymalizator regułowy, który począwszy od wersji 7 jest stopniowo wypierany przez optymalizator kosztowy. Ostatecznie w Oracle 10g optymalizator regułowy został wyeliminowany całkowicie. Zadaniem każdego administratora Oracle jest dbanie o prawidłowe działanie systemu, a w szczególności optymalną pracę silnika SQL. Jeśli korzystamy z optymalizatora kosztowego, to musimy dbać o regularnie liczenie statystyk dla tabel i indeksów. Jest to niezbędne do określenia prawidłowego planu wykonania dla zapytań. Jednakże po zainstalowaniu bazy danych Oracle, niezależnie od tego czy działa na nowoczesnym serwerze, czy starym PC, jest ona domyślnie tak samo skonfigurowana. Aby Oracle prawidłowo działał, należy go odpowiednio dostroić do sprzętu, na którym jest zainstalowany. Przeważnie jest to żmudny proces dobierania parametrów bazy danych, np. OPTIMIZER_INDEX_COST_ADJ, czy DB_MULTIBLOCK_READ_COUNT, które pozwalają wskazać optymalizatorowi właściwsze ścieżki dostępu do danych. W wersjach wcześniejszych niż 9i koszt zapytań był wyznaczany wyłącznie w oparciu o szacowany koszt operacji wejścia/wyjścia. Od wersji 9i optymalizator szacuje koszt zapytania, uwzględniając także dostępną moc procesora. Aby szacunki były prawidłowe, należy "poinformować" Oracle'a na jakim sprzęcie został zainstalowany. W tym celu w Oracle 9i został wprowadzony mechanizm wyznaczania Statystyk Systemowych. Dlaczego kalibracja jest ważnaOptymalizator kosztowy, podczas określania planu wykonania dla zapytania, wyznacza koszt pojedynczej operacji I/O oraz koszt przetwarzania danych przez CPU. Domyślna instalacja Bazy Danych Oracle'a nie ma określonej charakterystyki konkretnego sprzętu, na którym została zainstalowana. Dlatego optymalizator przyjmuje uśrednione wartości dla kosztu operacji I/O oraz wydajności procesora. Na parametry te można wpływać modyfikując ustawienia wspomnianych wcześniej parametrów: OPTIMIZER_INDEX_COST_ADJ, OPTIMIZER_INDEX_CACHING czy DB_MULTIBLOCK_READ_COUNT. Jednakże zmiana tych parametrów wymaga czasochłonnego procesu, polegającego na:
Proces ten jest czasochłonny i często opiera się na dotychczasowym doświadczeniu administratora. Baza danych Oracle 9i ma możliwość dostosowania planu wykonania do konkretnego sprzętu. W tym celu konieczne jest określenie charakterystyki dla:
Oczywiście, nikt nie wymaga, aby takie parametry ustawiać ręcznie;
choć jest to także możliwe. Do wyznaczenia charakterystyki sprzętu używana
jest procedura Jak skalować systemAby statystyki były adekwatne do konkretnego systemu, muszą być zebrane podczas typowej aktywności serwera. Dotyczy to zarówno bazy danych, jak i innej aktywności systemu operacyjnego. Wynika to z faktu, iż inne procesy także wykorzystują CPU, co wpływa na czas dostępności CPU dla procesów Oracle'a. Także operacje wejścia/wyjścia generowane przez inne procesy wpływają na czasy dostępu do danych procesów Oracle'a. Aby uruchomić zbieranie należy najpierw przygotować tabele, w której przechowywane będą statystyki:
Oczywiście możliwe jest zapamiętanie statystyk w tabelach słownikowych Oracle'a. Statystyki systemowe są zbierane w określonym okresie czasu. Można uruchomić statystyki, odczekać odpowiedni okres czasu i ręcznie zakończyć zbieranie statystyk, lub podczas startu określić okres, przez który będą zbierane statystyki. Tak więc startujemy:
W tabeli przechowującej statystyki pojawiają się dwa rekordy. Możemy sprawdzić aktualny status zebranych statystyk:
Po upłynięciu okresu czasu, przez który były zbierane statystyki, kończymy zbieranie statystyk wykonując:
Ponowne kontrolujemy status zebranych statystyk:
Teraz możemy zweryfikować zebrane dane przy użyciu procedury DBMS_STATS.GET_SYSTEM_STATS:
Jako parametr pname można podać:
Jeśli chodzi o wyliczoną częstotliwość taktowania procesora, to niezbyt to odpowiada rzeczywistej wartości. W rzeczywistości procesor taktowany był 1400 MHz. Wyliczona wartość bardziej odpowiada częstotliwości głównej magistrali. Inne materiały firmy Oracle mówią, że parametr zawiera liczbę cykli procesora wyrażoną w milionach. Może się zdarzyć, że wartość statystyki będzie miała wartość -1. Oznacza to, że podczas analizy nie było możliwe wyliczenie charakterystyki. Np. baza danych nie wygenerowała żadnej operacji odczytu wielu bloków (multiblock read), przez co nie było możliwe wyliczenie tego parametru. W takim przypadku należy powtórzyć operację zbierania statystyk, i dodatkowo wydłużyć czas. Taki przypadek raczej nie ma prawa wystąpić w bazie produkcyjnej o dużym obciążeniu. Inną metodą zbierania statystyk jest wywołanie gather_system_stats z parametrem gathering_mode ustawionym na wartość 'INTERVAL', oraz określeniem czasu zbierania statystyk w parametrze interval (czas podany w minutach):
Spowoduje to uruchomienie procesu zbierania statystyk, a dodatkowo zostanie wstawione zadanie (JOB), które wykona za nas zakończenie zbierania statystyk w odpowiednim momencie czasu:
Proszę tylko pamiętać o sprawdzeniu parametru JOB_QUEUE_PROCESSES - musi mieć wartość większą od zera. Jak użyć statystyk systemowychStatystyki, które zostały zebrane do utworzonej tabeli, nie mają wpływu na działanie optymalizatora. Aby poinformować optymalizator o wyliczonych statystykach, należy zaimportować je do słownika systemowego. Można to zrobić instrukcją:
Powoduje to skopiowanie wyliczonych statystyk, które są zapisane w tabeli SYSTEM.MY_STAT_TAB, pod identyfikatorem ST1 do słownika systemowego Oracle, co powoduje, że będą uwzględniane przez optymalizator. Istnieje także możliwość zmodyfikowania dowolnej ze statystyk. W tym celu używamy procedury set_system_stats, np:
powoduje to ustawienie szybkości procesora na 333 miliony cykli na sekundę. Procedura set_system_stats może także dokonać modyfikacji statystyk zawartych w tabeli statystyk, poprzez określenie opcjonalnych parametrów: stattab, statid, statown. Sprawdźmy, jak wyglądają obecnie statystyki zawarte w słowniku systemowym:
Przydatne może się także okazać przeniesienie statystyk ze słownika systemowego Oracle do własnej tabeli ze statystykami. W tym celu należy zastosować procedurę export_system_stats. Jak statystyki wpływają na optymalizator kosztowyNo dobrze, mamy zebrane statystyki systemu, ale jaki jest ich wpływ na działanie optymalizatora? Oracle podczas tworzenia planu wykonania zapytania rozważa różne możliwe ścieżki wyboru danych. Decyduje, czy wykonać przeszukanie całej tabeli (Table Full Scan), czy szukać wg klucza w indeksie. Statystyki, które odpowiadają rzeczywistym parametrom systemu, na którym jest zainstalowana baza Oracle, pozwalają na dobranie właściwej ścieżki dostępu do danych. Wpływ poszczególnych parametrów jest następujący:
Sprawdźmy to w praktyceNajpierw dla pewności usuwamy statystyki systemowe.
Wykonajmy poniższy skrypt, który utworzy przykładowe tabele i wypełnijmy je danymi. Na koniec zostaną wyliczone statystyki dla tabel, aby mógł zadziałać optymalizator kosztowy.
Zobaczmy jak wygląda plan zapytania dla przykładowego zapytania na tych tabelach:
i plan wykonania dla tego zapytania:
Jednak, aby zaprezentować wpływ statystyk systemowych proponuję, aby plan zapytania generować przy użyciu poniższego zapytania:
W przypadku braku statystyk systemowych zapytanie zwróci: W powyższym zapytaniu wartość 5 została tak dobrana, aby wymusić korzystanie z indeksów w przypadku braku statystyk systemowych. Po zmianie o jeden (z 5 na 6) plan zapytania wygląda inaczej - występuje pełne przeglądanie tabeli MY_BIG. W przypadku innej instalacji bazy Oracle, inne wartości mogą być graniczne. Należy zwrócić uwagę, że w przypadku braku statystyk systemowych, do wyliczenia kosztu zapytania nie jest brany pod uwagę koszt CPU, a jedynie koszt operacji I/O. Teraz importujemy statystyki, które zostały wcześniej wyliczone i ponownie generujemy plan wykonania. Oto efekt: Zwróćmy uwagę, że w tym przypadku została zmieniona kolejność wyszukiwania danych w tabelach i na podstawie innej tabeli jest tworzona tablica hash'ująca. Proszę zwrócić uwagę, że spadł nieco koszt operacji I/O, oraz został wyznaczony koszt CPU (liczba proporcjonalna do liczby potrzebnych cykli procesora) Uwaga! Efekt jest zależny od konkretnej instalacji Oracle - na innej maszynie efekt może nie być widoczny, lub będzie inny. Zróbmy jeszcze mały eksperyment. Przekonajmy Oracla, że dysponujemy bardzo słabym procesorem:
Teraz plan wykonania wygląda tak:
W tym przypadku Oracle zmienił całkowicie plan wykonania zapytania tak, aby maksymalnie zmniejszyć koszt CPU. W efekcie wzrosła ilość operacji I/O i przez to wzrósł koszt I/O. Po wykonaniu powyższego eksperymentu należy jak najszybciej przywrócić rzeczywiste wartości statystyk, gdyż wartości eksperymentalne mogą prowadzić do spowolnienia działania bazy.
|
|||||||||||||||||
|
| English |
