Nel capitolo 3 di Oracle RAC Performance Tuning, ho mostrato come valori CACHE non corretti per le sequenze possono causare scarse prestazioni in Oracle RAC. Ho anche mostrato come individuare la contesa di sequenza quando si osservano gli eventi di attesa di una sessione.
Oggi stavo lavorando con uno sviluppatore che stava creando una nuova sequenza. Lo sviluppatore aveva un valore CACHE di 100, il che mi ha reso inizialmente un valore troppo basso. Ho notato questa impostazione bassa durante la revisione del codice. Lo sviluppatore pensa che il valore della CACHE vada bene ma non ne sono convinto. Lo testeremo sotto carico per vedere se il valore della CACHE deve essere modificato.
Nel frattempo, stavo pensando "e se me lo fossi perso durante la revisione del codice?" E una domanda successiva, "e se non avessimo notato nulla durante il test di carico?" Voglio essere in grado di tornare indietro e determinare quali sequenze, se presenti, sarebbero candidate per avere un'impostazione CACHE errata. Potrei certamente tracciare le sessioni e analizzare i file di traccia, ma sarebbe troppo doloroso. Quindi ho ideato uno script che posso eseguire sulla cronologia delle sessioni attive per aiutare a determinare le sequenze candidate.
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;
Questa non è una scienza perfetta a causa della natura della raccolta di ASH. La sessione in cui si verifica la contesa dovrebbe essere catturata al momento giusto per essere nella tabella DBA_HIST_ACTIVE_SESSION_HISTORY. Ma l'istruzione SQL sopra mi dà alcuni candidati da prendere in considerazione. Non tutte le sequenze a cui si accede nelle istruzioni SQL restituite devono avere i valori CACHE modificati. Sarebbe necessaria un'ulteriore analisi. Tuttavia, questo mi dà un elenco di quelli da considerare. E può aiutare a rispondere alle mie domande iniziali. Se ho perso la creazione della sequenza durante la revisione del codice, spero di poterla trovare in un secondo momento se la sequenza è un problema per le prestazioni dell'applicazione.