W rozdziale 3 Oracle RAC Performance Tuning pokazałem, jak niewłaściwe wartości CACHE dla sekwencji mogą powodować niską wydajność Oracle RAC. Pokazałem również, jak rozpoznać rywalizację o sekwencję, patrząc na zdarzenia oczekiwania sesji.
Dziś pracowałem z developerem, który tworzył nową sekwencję. Deweloper miał wartość CACHE równą 100, co sprawiło, że początkowo była to zbyt niska wartość. Zauważyłem to niskie ustawienie podczas przeglądu kodu. Deweloper uważa, że wartość CACHE jest w porządku, ale nie jestem przekonany. Przetestujemy to pod obciążeniem, aby sprawdzić, czy należy dostosować wartość CACHE.
W międzyczasie zastanawiałem się „a co, jeśli przegapię to podczas przeglądu kodu?” I kolejne pytanie:„A co, jeśli nie zauważymy niczego podczas testowania obciążenia?” Chcę móc cofnąć się i określić, które sekwencje, jeśli w ogóle, byłyby kandydatami do niewłaściwego ustawienia pamięci podręcznej. Z pewnością mógłbym śledzić sesje i analizować pliki śledzenia, ale byłoby to zbyt bolesne. Opracowałem więc skrypt, który mogę uruchomić w historii aktywnej sesji, aby pomóc określić sekwencje kandydujące.
select sh.sql_id,to_char(st.sql_text),count(*) from dba_hist_active_sess_history sh join dba_hist_sqltext st on sh.sql_id=st.sql_id where st.sql_text like '%NEXTVAL%' and (event='row cache lock' or event like 'gc current block %-way') group by sh.sql_id,to_char(st.sql_text) order by count(*) desc;
Nie jest to nauka doskonała ze względu na charakter kolekcji ASH. Sesja, w której występuje rywalizacja, musiałaby zostać przechwycona we właściwym czasie, aby znaleźć się w tabeli DBA_HIST_ACTIVE_SESSION_HISTORY. Ale powyższa instrukcja SQL daje mi kilka kandydatów do rozważenia. Nie każda sekwencja dostępna w zwracanych instrukcjach SQL musi mieć skorygowane wartości CACHE. Potrzebna byłaby dalsza analiza. Daje mi to jednak listę rzeczy do rozważenia. I może pomóc odpowiedzieć na moje początkowe pytania. Jeśli przegapiłem tworzenie sekwencji podczas przeglądu kodu, mam nadzieję, że znajdę go później, jeśli sekwencja stanowi problem z wydajnością aplikacji.