La métrica “Parse CPU to
Parse Elapsd %” revela que Oracle espera por algunos recursos durante el
análisis de una sentencia SQL. La causa principal puede obedecer a la cantidad
de cursores disponibles por sesión o a un problema de contención en el área de
Shared Pool.
Actualmente, el límite de
cursores por sesión en cada una de las instancias es 300 (open_cursors). Para
determinar el porcentaje de uso se recomienda ejecutar la siguiente sentencia:
select
'session_cached_cursors' parameter,
lpad(value, 5) value,
decode(value, 0, ' n/a', to_char(100 * used / value, '990') || '%') usage
from
( select
max(s.value) used
from
sys.v_$statname n,
sys.v_$sesstat s
where
n.name = 'session cursor cache count' and
s.statistic# = n.statistic#
),
( select
value
from
sys.v_$parameter
where
name = 'session_cached_cursors'
)
union all
select
'open_cursors',
lpad(value, 5),
to_char(100 * used / value, '990') || '%'
from
( select
max(sum(s.value)) used
from
sys.v_$statname n,
sys.v_$sesstat s
where
n.name in ('opened cursors current', 'session cursor cache count') and
s.statistic# = n.statistic#
group by
s.sid
),
( select
value
from
sys.v_$parameter
where
name = 'open_cursors'
) ;
El beneficio de estar correctamente
seteado el parámetro SESSION_CACHED_CURSORS, es reducir el tiempo de parse por
sesión que mejorará los tiempos totales de ejecución debido a que aumentará la
probabilidad de que una sentencia ya ejecutada por una sesión sea encontrada en
cache de la misma sesión reduciendo la contención del Library Cache y del
Shared Pool. Este ajuste debe realizarse de forma moderada dado que aumenta el
consumo de memoria considerablemente.
Adicionalmente para monitorear la
cantidad de cursores por usuario, se debe ejecutar la siguiente consulta:
select sum(a.value) total_cur, avg(a.value) avg_cur, max(a.value) max_cur,
s.username, s.machine
from v$sesstat a, v$statname b, v$session s
where a.statistic# = b.statistic# and s.sid=a.sid
and b.name = 'opened cursors current'
group by s.username, s.machine
order by 1 desc;
EXECUTE TO PARSE RATIO:
Esta métrica compara el
número de ejecuciones de una sentencia con el número de análisis realizados
sobre esta. Idealmente, una sentencia requiere un solo análisis por un cierto
número de ejecuciones. Un valor relativamente bajo o negativo indica que se
están analizando sentencias y nunca se ejecutan posteriormente o se ejecuta un
análisis (para obtener entradas/salidas) y luego se vuelve a analizar la
sentencia en tiempo de ejecución.
Teniendo en cuenta que si la
aplicación es web esta métrica debe estar por encima del 50% y si es
cliente-servidor por encima del 90%. Si esto no llegase a ocurrir, se debe
ejecutar la siguiente consulta que permitirá identificar aquellas sentencias
que están siendo analizadas sin ser ejecutadas, dicho reporte puede ser enviado
al equipo de desarrollo con el fin de realizar los ajustes respectivos.
select sql_text, sum(parse_calls), sum(executions) from v$sql
group by sql_text
having sum(parse_calls)>sum(executions)
order by 2 asc
No hay comentarios.:
Publicar un comentario