Jak wiemy, aby trafnie estymować koszty planów wykonania zapytań, optymalizator zapytań wymaga obecności szeregu statystyk (modeli statystycznych). Statystyki te dzielą się na cztery kategorie: (1) statystyki opisujące tabele (liczba rekordów, liczba bloków, średni rozmiar rekordu), (2) statystyki opisujące indeksy (liczba bloków liści, liczba poziomów, współczynnik klastrowania), (3) statystyki opisujące kolumny tabel (liczba wartości, liczba wartości pustych, rozkład wartości – histogram), (4) statystyki systemowe (wydajność CPU, wydajność dyskowego I/O). O ile pierwsze trzy kategorie statystyk są zwykle właściwie zbierane i aktualizowane przed administratorów (lub przez „fabryczne” zadanie wsadowe), to o statystykach systemowych „zdarza się” im zapominać.
Czym są statystyki systemowe? Są syntetycznym opisem charakterystyki wydajnościowej sprzętu komputerowego, na którym pracuje serwer bazy danych. Obejmują takie wskaźniki, jak: szybkość procesora, średni czas odczytu dyskowego (swobodnego i wieloblokowego), średni rozmiar odczytu wieloblokowego z dysku, średnią szybkość transmisji danych z dysku, itp. Jak zatem optymalizator radzi sobie z estymowaniem kosztów gdy statystyki systemowe są niedostępne? Zakłada wtedy „typowe” parametry sprzętu. Jeśli nasz sprzęt jest „typowy” – wyniki pracy optymalizatora będą dobre. Jeśli jednak dysponujemy „nietypowo” szybkim lub „nietypowo” wolnym procesorem, „nietypowo” szybkim lub „nietypowo” wolnym dyskiem, itp., wtedy zgromadzenie statystyk systemowych jest prostym sposobem na poprawę precyzji działania optymalizatora.
Zebranie statystyk systemowych polega na obserwacji wydajności systemu w okresie „normalnego” obciążenia użytkowego. Wybór właściwego okresu czasu to zadanie dla administratora. Rozpoczęcie obserwacji polega na wywołaniu dbms_stats.gather_system_stats('start')
, zakończenie obserwacji – dbms_stats.gather_system_stats('stop')
. W przeciwieństwie do pozostałych typów statystyk, statystyk systemowych nie aktualizuje sie regularnie.
Zebrane statystyki systemowe obejrzeć można za pomocą poniższego zapytania:
select pname, pval1 from sys.aux_stats$ where sname = 'SYSSTATS_MAIN';
Statystykami systemowymi można też „manipulować” – za pomocą procedury dbms_stats.set_system_stats()
!
Ponieważ statystyki systemowe są składnikiem formuł estymacyjnych stosowanych przez optymalizator, to zauważalnym efektem ich zebrania będą zmiany estymowanych kosztów planów wykonania zapytań, co w konsekwencji może sprawić, że optymalizator będzie wybierać inne (trafniejsze) plany niż dotąd.
1 thought on “A czy pamiętasz o statystykach systemowych?”