miércoles, 22 de julio de 2009

Reporte de sentencias que cambiaron su plan durante un cierto periodo de tiempo

Una de las posibles causas de baja de rendimiento de una base puede deberse a que una sentencia central haya cambiado su plan de ejecución. Es importante tener monitoreadas las sentencias mas importantes de manera de poder anticipar problemas de performance generalizado. Para poder observar los cambios de planes les paso el codigo de un script que armé que además de detectar los sqlid's que tienen más de un plan durante un cierto periodo, también genera el plan para poder chequerlo mas rapidamente


set term off
set serveroutput on size unlimited
set pagesize 4000
set echo off
set verify off
set feedback off
set line 1000
alter session set nls_date_format='DD/MM/YYYY HH24:MI:SS';
set term on

prompt *****************************************************************
prompt * Ingrese la cantidad de dias para analizar el cambio de planes *
prompt *****************************************************************
accept dias prompt 'Cantidad de Dias > '
prompt ***************************************************************************
prompt * Ingrese el nombre del archivo y ruta donde desea guardar la información *
prompt ***************************************************************************
accept path prompt 'Path > '

set term off;

spool '&path'


prompt
prompt ***************************************************************
prompt ************* Listado de Consultas y Planes *****************
prompt ***************************************************************
prompt


-- Query para detectar cambios de planes
select a.sql_id,a.timestamp,a.plan_hash_value,a.optimizer,a.cost
from dba_hist_sql_plan a
where a.sql_id in (select b.sql_id
from dba_hist_sql_plan b
where timestamp > trunc(sysdate-&dias)
group by sql_id
having count(distinct b.plan_hash_value) > 1)
and a.timestamp > trunc(sysdate-&dias)
and a.id = 0
order by 1,2;

prompt
prompt
prompt ***************************************************************
prompt ************* Detalle de Consultas y Planes *****************
prompt ***************************************************************
prompt


begin
for i in (select a.sql_id,a.timestamp,a.plan_hash_value,a.optimizer,a.cost
from dba_hist_sql_plan a
where a.sql_id in (select b.sql_id
from dba_hist_sql_plan b
where timestamp > trunc(sysdate-&dias)
group by sql_id
having count(distinct b.plan_hash_value) > 1)
and a.timestamp > trunc(sysdate-&dias)
and a.id = 0
order by 1,2)
loop
for j in (select plan_table_output
from table(dbms_xplan.display_awr(i.sql_id,i.plan_hash_value)))
loop
dbms_output.put_line(j.plan_table_output);
end loop;
end loop;
end;
/

set term on;
prompt Archivo de Salida del reporte --> "&path"
set term off;
set echo on
set verify on
set feedback on
set term on

No hay comentarios:

Publicar un comentario