I kapitel 3 i Oracle RAC Performance Tuning visade jag hur felaktiga CACHE-värden för sekvenser kan orsaka dålig prestanda i Oracle RAC. Jag visade också hur man upptäcker sekvensstrider när man tittar på en sessions väntande händelser.
Idag arbetade jag med en utvecklare som skapade en ny sekvens. Utvecklaren hade ett CACHE-värde på 100, vilket gjorde att jag till en början var för lågt värde. Jag upptäckte denna låga inställning under kodgranskning. Utvecklaren tycker att CACHE-värdet är bra men jag är inte övertygad. Vi kommer att testa detta under belastning för att se om CACHE-värdet behöver justeras.
Under tiden tänkte jag "tänk om jag missade detta under kodgranskning?" Och en följdfråga, "tänk om vi inte märkte något under belastningstestning?" Jag vill kunna gå tillbaka och avgöra vilka sekvenser, om några, skulle vara kandidater för att ha en felaktig CACHE-inställning. Jag skulle säkert kunna spåra sessioner och analysera spårningsfilerna, men det skulle vara för smärtsamt. Så jag tog fram ett skript som jag kan köra mot Active Session History för att hjälpa till att fastställa kandidatsekvenser.
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;
Detta är inte en perfekt vetenskap på grund av ASH-insamlingens natur. Sessionen som upplever konflikten skulle behöva fångas vid precis rätt tidpunkt för att vara i tabellen DBA_HIST_ACTIVE_SESSION_HISTORY. Men SQL-satsen ovan ger mig några kandidater att överväga. Inte varje sekvens som nås i de returnerade SQL-satserna behöver ha sina CACHE-värden justerade. Ytterligare analys skulle behövas. Det här ger mig dock en lista över dem att överväga. Och det kan hjälpa mig att svara på mina första frågor. Om jag missade sekvensskapandet under kodgranskning kan jag förhoppningsvis hitta den senare om sekvensen är ett problem för applikationens prestanda.