En el Capítulo 3 de Oracle RAC Performance Tuning, mostré cómo los valores incorrectos de CACHE para las secuencias pueden causar un rendimiento deficiente en Oracle RAC. También mostré cómo detectar la contención de secuencias al observar los eventos de espera de una sesión.
Hoy, estaba trabajando con un desarrollador que estaba creando una nueva secuencia. El desarrollador tenía un valor CACHE de 100, lo que me hizo que inicialmente la cosa fuera un valor demasiado bajo. Descubrí esta configuración baja durante la revisión del código. El desarrollador cree que el valor de CACHE está bien, pero no estoy convencido. Probaremos esto bajo carga para ver si es necesario ajustar el valor de CACHE.
Mientras tanto, estaba pensando "¿y si me perdí esto durante la revisión del código?" Y una pregunta de seguimiento, "¿qué pasa si no notamos nada durante la prueba de carga?" Quiero poder regresar y determinar qué secuencias, si las hay, serían candidatas para tener una configuración de CACHE incorrecta. Ciertamente podría rastrear sesiones y analizar los archivos de rastreo, pero eso sería demasiado doloroso. Así que ideé un script que puedo ejecutar en el historial de sesiones activas para ayudar a determinar las secuencias candidatas.
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;
Esta no es una ciencia perfecta debido a la naturaleza de la recolección de ASH. La sesión que experimente la contención debería capturarse en el momento justo para estar en la tabla DBA_HIST_ACTIVE_SESSION_HISTORY. Pero la declaración SQL anterior me da algunos candidatos para su consideración. No todas las secuencias a las que se accede en las sentencias SQL devueltas necesitan que se ajusten sus valores CACHE. Sería necesario un mayor análisis. Sin embargo, esto me da una lista de los que considerar. Y puede ayudar a responder mis preguntas iniciales. Si me perdí la creación de la secuencia durante la revisión del código, espero poder encontrarla más tarde si la secuencia es un problema para el rendimiento de la aplicación.