Thursday, September 2, 2010

Scheduler Job to purge old statspack data



DECLARE

plsql_block VARCHAR2(4000);
BEGIN

plsql_block := '
DECLARE
   dbId       NUMBER;
   instNum    NUMBER;
   loSnap     NUMBER;
   hiSnap     NUMBER;
   snpsPurged NUMBER;
BEGIN  

    SELECT d.dbid, i.instance_number
      INTO dbId, instNum
      FROM v$database d,
           v$instance i;

     SELECT MIN( s.snap_id ), MAX( s.snap_id )
       INTO loSnap, hiSnap
       FROM stats$snapshot s            
     WHERE s.dbid = dbId AND
           s.instance_number = instNum AND
           s.snap_time < SYSDATE - 30 AND
           EXISTS( SELECT 1
                     FROM stats$database_instance di
                   WHERE di.dbid = dbId AND
                         di.instance_number  = instNum AND
                         di.startup_time     = s.startup_time);

     IF loSnap > 0 AND hiSnap >0 THEN
        snpsPurged := STATSPACK.PURGE( i_begin_snap      => loSnap,
                                       i_end_snap        => hiSnap,
                                       i_snap_range      => TRUE,
                                       i_extended_purge  => FALSE,
                                       i_dbid            => dbId,
                                       i_instance_number => instNum);
     END IF;
    
END;';
          
DBMS_SCHEDULER.CREATE_JOB(
     job_name            =>'PURGE_STATSPACK',
     job_type            => 'PLSQL_BLOCK',
     job_action          => plsql_block,
     repeat_interval     => 'FREQ=DAILY; BYDAY=SUN; BYHOUR=02; BYMINUTE=00;',
     enabled             => TRUE );
                                      
END;
/

No comments: