天天看点

如何清除statspack相关表的历史数据

本次想清除2014年以前statspack相关表的历史数据。

1.找出2014年1月1日之前对应最大的SNAP_ID值

select Max(SNAP_ID)
  from stats$snapshot
 Where snap_time < to_date('2014-01-01', 'YYYY-MM-DD');
           
如何清除statspack相关表的历史数据

2.根据Oracle DB环境的官方提供的脚本($ORACLE_HOME/rdbms/admin/sptrunc.sql)

Declare
  l_SNAP_ID Number := 103;
Begin
  Delete From STATS$FILESTATXS Where SNAP_ID <= l_SNAP_ID;
  Delete From STATS$TEMPSTATXS Where SNAP_ID <= l_SNAP_ID;
  Delete From STATS$LATCH Where SNAP_ID <= l_SNAP_ID;
  Delete From STATS$LATCH_CHILDREN Where SNAP_ID <= l_SNAP_ID;
  Delete From STATS$LATCH_MISSES_SUMMARY Where SNAP_ID <= l_SNAP_ID;
  Delete From STATS$LATCH_PARENT Where SNAP_ID <= l_SNAP_ID;
  Delete From STATS$LIBRARYCACHE Where SNAP_ID <= l_SNAP_ID;
  Delete From STATS$BUFFER_POOL_STATISTICS Where SNAP_ID <= l_SNAP_ID;
  Delete From STATS$ROLLSTAT Where SNAP_ID <= l_SNAP_ID;
  Delete From STATS$ROWCACHE_SUMMARY Where SNAP_ID <= l_SNAP_ID;
  Delete From STATS$SGA Where SNAP_ID <= l_SNAP_ID;
  Delete From STATS$SGASTAT Where SNAP_ID <= l_SNAP_ID;
  Delete From STATS$SYSSTAT Where SNAP_ID <= l_SNAP_ID;
  Delete From STATS$SESSTAT Where SNAP_ID <= l_SNAP_ID;
  Delete From STATS$SYSTEM_EVENT Where SNAP_ID <= l_SNAP_ID;
  Delete From STATS$SESSION_EVENT Where SNAP_ID <= l_SNAP_ID;
  Delete From STATS$BG_EVENT_SUMMARY Where SNAP_ID <= l_SNAP_ID;
  Delete From STATS$WAITSTAT Where SNAP_ID <= l_SNAP_ID;
  Delete From STATS$ENQUEUE_STAT Where SNAP_ID <= l_SNAP_ID;
  Delete From STATS$SQL_SUMMARY Where SNAP_ID <= l_SNAP_ID;
  Delete From STATS$SQL_STATISTICS Where SNAP_ID <= l_SNAP_ID;
  Delete From STATS$SQLTEXT Where LAST_SNAP_ID <= l_SNAP_ID;
  Delete From STATS$PARAMETER Where SNAP_ID <= l_SNAP_ID;
  Delete From STATS$RESOURCE_LIMIT Where SNAP_ID <= l_SNAP_ID;
  Delete From STATS$DLM_MISC Where SNAP_ID <= l_SNAP_ID;
  Delete From STATS$UNDOSTAT Where SNAP_ID <= l_SNAP_ID;
  Delete From STATS$SQL_PLAN Where SNAP_ID <= l_SNAP_ID;
  Delete From STATS$SQL_PLAN_USAGE Where SNAP_ID <= l_SNAP_ID;
  Delete From STATS$SEG_STAT Where SNAP_ID <= l_SNAP_ID;
  --Select * From STATS$SEG_STAT_OBJ
  Delete From STATS$DB_CACHE_ADVICE Where SNAP_ID <= l_SNAP_ID;
  Delete From STATS$PGASTAT Where SNAP_ID <= l_SNAP_ID;
  Delete From STATS$INSTANCE_RECOVERY Where SNAP_ID <= l_SNAP_ID;
  Delete from STATS$SNAPSHOT Where SNAP_ID <= l_SNAP_ID;
  Delete from STATS$DATABASE_INSTANCE Where SNAP_ID <= l_SNAP_ID;
  Commit;
Exception
  When Others Then
    Rollback;
End;
           

由于采用以上方法删除数据非常慢,通常是删除全部统计的历史记录。建议用Oracle DB用户perfstat操作,具体方法如下:

SQL> @$ORACLE_HOME/rdbms/admin/sptrunc.sql

Warning
~~~~~~~
Running sptrunc.sql removes ALL data from Statspack tables.  You may
wish to export the data before continuing.


About to Truncate Statspack Tables
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
If would like to exit WITHOUT truncating the tables, enter any text at the
begin_or_exit prompt (e.g. 'exit'), otherwise if you would like to begin
the truncate operation, press <return>


Enter value for begin_or_exit: 
           

在“Enter value for begin_or_exit: ”处无需求输入,直接回车就即可。