Buscar este blog

viernes, 3 de junio de 2016

PARSE CPU TO PARSE ELAPSD %

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.: