我们都知道oracle从10g开始提供了Automatic Workload Repository (AWR)来完成对系统性能数据的自动收集和存储,甚至利用ADDM能够进一步完成自我诊断。但是这个工具包是企业版才提供的,
对于标准版并不是免费的,不过购买标准版license的客户仍然能够使用9i开始提供的Statspack功能包。但是AWR因为有完善的自我管理功能,如自动收集,自动清理,
所以是使用上非常便捷,相比免费的Statspack就没有任何自动维护功能,需要客户自行手动运行性能数据的收集和历史数据的清理。
对于statspack历史数据的清理问题,官方自带的@?/rdbms/admin/spdoc.txt文档是有所描述的:以11204版本为例
8.  Managing and Sharing performance data 
    8.2. Purging/removing unnecessary data
       8.2.1. Input Parameters for the PURGE procedure and function
              which accept Begin Snap Id and End Snap Id       
       8.2.2. Input Parameters for the PURGE procedure and function
              which accept Begin Date and End Date
       8.2.3. Input Parameters for the PURGE procedure and function
              which accept a single Purge Before Date
       8.2.4. Input Parameters for the PURGE procedure and function
              which accept the Number of Days of data to keep
       8.2.5. Using sppurge.sql
可以看到官方purge方法提供了4种形式:

1.输入起始snapshot和终止snapshot
       SQL> variable num_snaps number;
       SQL> begin
       SQL>   :num_snaps := statspack.purge(i_begin_snap=>1237, i_end_snap=>1241, i_extended_purge=>TRUE);
       SQL> end;
       SQL> /
2.输入起始日期和终止日期
        SQL> exec statspack.purge –
               (i_begin_date=>to_date(’01-JAN-2003′, ‘DD-MON-YYYY’), –
                i_end_date  =>to_date(’02-JAN-2003′, ‘DD-MON-YYYY’), –
                i_extended_purge=>TRUE);
3.输入单一日期,
       SQL> exec statspack.purge(to_date(’31-OCT-2002′,’DD-MON-YYYY’));
4.输入保留天数:
       SQL> exec statspack.purge(31);

除了清理部分数据的方法,还有整体清理的手段:
 sqlplus>conn PERFSTAT/paswd    <<需要在PERFSTAT用户下执行
 sqlplus>@?/rdbms/admin/sptrunc

    Enter value for begin_or_exit: 
    Entered at the ‘begin_or_exit’ prompt  <<exit 可以中止执行

    … Starting truncate operation

    Table truncated.
    Table truncated.
    <etc…>

    Commit complete. 
    Package altered. 
    … Truncate operation complete

除了上述官方的清理办法之外,还有一种简单办法就是直接删除STATS$SNAPSHOT,如
delete from STATS$SNAPSHOT where SNAP_ID<100; 因为oracle 在设计statspack的时候,其他表都是通过外键约束关联到这个
核心表的,并且约束上是有on delete cascade 语句 ,当删除核心表STATS$SNAPSHOT 数据时,这些关联表都会随之删除。
下面是通过对 delete from STATS$SNAPSHOT where SNAP_ID<100; 进行10046 trace的情况,可以看到所有表
都会进行清理。 

delete from “PERFSTAT”.”STATS$DB_CACHE_ADVICE” where “SNAP_ID” = :1 and “DBID” = :2 and “INSTANCE_NUMBER” = :3
delete from “PERFSTAT”.”STATS$FILESTATXS” where “SNAP_ID” = :1 and “DBID” = :2 and “INSTANCE_NUMBER” = :3
delete from “PERFSTAT”.”STATS$TEMPSTATXS” where “SNAP_ID” = :1 and “DBID” = :2 and “INSTANCE_NUMBER” = :3
delete from “PERFSTAT”.”STATS$LATCH” where “SNAP_ID” = :1 and “DBID” = :2 and “INSTANCE_NUMBER” = :3
delete from “PERFSTAT”.”STATS$LATCH_CHILDREN” where “SNAP_ID” = :1 and “DBID” = :2 and “INSTANCE_NUMBER” = :3
delete from “PERFSTAT”.”STATS$LATCH_PARENT” where “SNAP_ID” = :1 and “DBID” = :2 and “INSTANCE_NUMBER” = :3
delete from “PERFSTAT”.”STATS$LATCH_MISSES_SUMMARY” where “SNAP_ID” = :1 and “DBID” = :2 and “INSTANCE_NUMBER” = :3
delete from “PERFSTAT”.”STATS$LIBRARYCACHE” where “SNAP_ID” = :1 and “DBID” = :2 and “INSTANCE_NUMBER” = :3
delete from “PERFSTAT”.”STATS$BUFFER_POOL_STATISTICS” where “SNAP_ID” = :1 and “DBID” = :2 and “INSTANCE_NUMBER” = :3
delete from “PERFSTAT”.”STATS$ROLLSTAT” where “SNAP_ID” = :1 and “DBID” = :2 and “INSTANCE_NUMBER” = :3
delete from “PERFSTAT”.”STATS$ROWCACHE_SUMMARY” where “SNAP_ID” = :1 and “DBID” = :2 and “INSTANCE_NUMBER” = :3
delete from “PERFSTAT”.”STATS$SGA” where “SNAP_ID” = :1 and “DBID” = :2 and “INSTANCE_NUMBER” = :3
delete from “PERFSTAT”.”STATS$SGASTAT” where “SNAP_ID” = :1 and “DBID” = :2 and “INSTANCE_NUMBER” = :3
delete from “PERFSTAT”.”STATS$SYSSTAT” where “SNAP_ID” = :1 and “DBID” = :2 and “INSTANCE_NUMBER” = :3
delete from “PERFSTAT”.”STATS$SESSTAT” where “SNAP_ID” = :1 and “DBID” = :2 and “INSTANCE_NUMBER” = :3 
。。。。。。省略


综上所述,虽然statspack虽然没有提供自动维护的机制,但是对于数据的维护清理还是提供了很多方便的手段,客户只要自己编写一个job或者后台shell就可以
实现自动化。