本次想清除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');

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: ”处无需求输入,直接回车就即可。