Statystyki w bazie danych to taki miły mechanizm mający za zadanie optymalizację wykonywania zapytań sql-owych. Zarządzanie statystykami jest dość proste. Poniżej parę uwag dla bazy 11gR2. Niestety w Oracle DB z wersji na wersje statystyki są troszkę inaczej obsługiwane.Jeśli nie masz pewności czy na Twojej bazie statystyki są aktualne warto zapuścić kilka procedur. Po pierwsze wato odblokować wszystkie obiekty, które mają zablokowane generowanie statystyk (często taki objawy są po imporcie danych za pomocą impdp) – dla każdej schema dla której istnieją podejrzenie iż ma jakieś zablokowane statystyki należy wykonać z sys as sysdba :
execute DBMS_STATS.UNLOCK_SCHEMA_STATS(ownname => 'schema_name');
po odblokowaniu statystyk warto aby baza wiedziała jak wydajne jest I/O systemu na którym pracuje. Wystarczy jedno polecenie (tez z sys as sysdba):
execute GATHER_SYSTEM_STAT();
jeśli nam się nudzi można statystyki I/O dokładniej pozbierać. Wystarczy aby uruchomić zbieranie (start), wykonać najważniejsze sql-e od których zależy wydajność naszej aplikacji i zatrzymać zbieranie statystyk
execute GATHER_SYSTEM_STAT(gathering_mode => 'START'); -- tu wykonujemy zapytania od ktorych zalezy wydajnosc naszej bazy -- obojetne czy w tej sesji czy w innej czy tez poprostu klikajac w -- w jakiejs aplikacji
execute GATHER_SYSTEM_STAT(gathering_mode => 'STOP');
Kolejnym dobrym krokiem jest zapuszczenie statystyk na wszystkich obiektach (tez z sys as sysdba):
execute DBMS_STATS.GATHER_DATABASE_STATS();
a jako wisienkę na torcie możemy sobie jeszcze wyznaczyć w jakich godzinach mają być zbierane automatyczne statystyki
execute DBMS_SCHEDULER.SET_ATTRIBUTE('MONDAY_WINDOW','repeat_interval','freq=daily;byday=MON;byhour=1;byminute=0; bysecond=0');
execute DBMS_SCHEDULER.SET_ATTRIBUTE('TUESDAY_WINDOW','repeat_interval','freq=daily;byday=TUE;byhour=1;byminute=0; bysecond=0');
execute DBMS_SCHEDULER.SET_ATTRIBUTE('WEDNESDAY_WINDOW','repeat_interval','freq=daily;byday=WED;byhour=1;byminute=0; bysecond=0');
execute DBMS_SCHEDULER.SET_ATTRIBUTE('THURSDAY_WINDOW','repeat_interval','freq=daily;byday=THU;byhour=1;byminute=0; bysecond=0');
execute DBMS_SCHEDULER.SET_ATTRIBUTE('FRIDAY_WINDOW','repeat_interval','freq=daily;byday=FRI;byhour=1;byminute=0; bysecond=0');
execute DBMS_SCHEDULER.SET_ATTRIBUTE('SATURDAY_WINDOW','repeat_interval','freq=daily;byday=SAT;byhour=6;byminute=0; bysecond=0');
execute DBMS_SCHEDULER.SET_ATTRIBUTE('SUNDAY_WINDOW','repeat_interval','freq=daily;byday=SUN;byhour=6;byminute=0; bysecond=0');
dla wyjaśnienia – standardowo codziennie uruchamiane są automatyczne zadania w ‘okienku serwisowym’, między innymi zadanie generowania statystyk. Powyższe polecenia pozwolą nam ustalić w jakich godzinach rozpoczynają się ‘okienka serwisowe’. Jest to o tyle przydatne, że możemy okienka umiejscowić w godzinach, w których baza jest najmniej obciążona.