Oracle文档推荐的STATSPACK过期数据产生的方法是直接删除STATS$SNAPSHOT表中的记录。
这篇文章说明第一篇文章中没有描述清楚的数据清除问题。
STATSPACK数据清除(一):http://yangtingkun.itpub.net/post/468/466248
STATSPACK数据清除(二):http://yangtingkun.itpub.net/post/468/466514
之所以隔了3年才有这篇文章,完全是野花的缘故。野花前一段在折腾STATSPACK是发现了我的文章,并且对于我之前没有得出结论的数据清除问题做出了解答,之所以删除STATS$SNAPSHOT就会导致其他表的数据自动删除,并非是Oracle的什么内部机制,其实道理很简单,就是Oracle建立的是CASCADE ON DELETE约束条件。
看来自己在开发方面还是外行,一直没有想到这个问题,于是特意找到了一个9i上部署STATSPACK的数据库,验证一下:
SQL> SELECT CONSTRAINT_NAME, CONSTRAINT_TYPE, STATUS, DELETE_RULE 2 FROM DBA_CONSTRAINTS 3 WHERE TABLE_NAME = 'STATS$SNAPSHOT' 4 AND OWNER = 'PERFSTAT' 5 AND CONSTRAINT_TYPE = 'P'; CONSTRAINT_NAME C STATUS DELETE_RU ------------------------------ - -------- --------- STATS$SNAPSHOT_PK P ENABLED SQL> SELECT CONSTRAINT_NAME, CONSTRAINT_TYPE, STATUS, DELETE_RULE 2 FROM DBA_CONSTRAINTS 3 WHERE OWNER = 'PERFSTAT' 4 AND CONSTRAINT_TYPE = 'R' 5 AND R_CONSTRAINT_NAME = 'STATS$SNAPSHOT_PK'; CONSTRAINT_NAME C STATUS DELETE_RU ------------------------------ - -------- --------- STATS$BG_EVENT_SUMMARY_FK R ENABLED CASCADE STATS$BUFFER_POOL_STATS_FK R ENABLED CASCADE STATS$DB_CACHE_ADVICE_FK R ENABLED CASCADE STATS$DLM_MISC_FK R ENABLED CASCADE STATS$ENQUEUE_STAT_FK R ENABLED CASCADE STATS$FILESTATXS_FK R ENABLED CASCADE STATS$INSTANCE_RECOVERY_FK R ENABLED CASCADE STATS$LATCH_CHILDREN_FK R ENABLED CASCADE STATS$LATCH_FK R ENABLED CASCADE STATS$LATCH_MISSES_SUMMARY_FK R ENABLED CASCADE STATS$LATCH_PARENT_FK R ENABLED CASCADE STATS$LIBRARYCACHE_FK R ENABLED CASCADE STATS$PARAMETER_FK R ENABLED CASCADE STATS$PGA_TARGET_ADVICE_FK R ENABLED CASCADE STATS$RESOURCE_LIMIT_FK R ENABLED CASCADE STATS$ROLLSTAT_FK R ENABLED CASCADE STATS$ROWCACHE_SUMMARY_FK R ENABLED CASCADE STATS$SEG_STAT_FK R ENABLED CASCADE STATS$SESSION_EVENT_FK R ENABLED CASCADE STATS$SESSTAT_FK R ENABLED CASCADE STATS$SGASTAT_FK R ENABLED CASCADE STATS$SGA_FK R ENABLED CASCADE STATS$SHARED_POOL_ADVICE_FK R ENABLED CASCADE STATS$SQL_PGASTAT_FK R ENABLED CASCADE STATS$SQL_PLAN_USAGE_FK R ENABLED CASCADE STATS$SQL_STATISTICS_FK R ENABLED CASCADE STATS$SQL_SUMMARY_FK R ENABLED CASCADE STATS$SQL_WORKAREA_HIST_FK R ENABLED CASCADE STATS$SYSSTAT_FK R ENABLED CASCADE STATS$SYSTEM_EVENT_FK R ENABLED CASCADE STATS$TEMPSTATXS_FK R ENABLED CASCADE STATS$WAITSTAT_FK R ENABLED CASCADE 32 ROWS selected. |
显然之所以删除STATS$SNAPSHOT表会导致STATSPACK整体数据被清除,是因为所有的外键都设置了CASCADE ON DELETE。这也是第二篇文章中描述的那些不含SNAP_ID的表没有自动清除的原因。