Statspack 报告分为如下部分: 

 1.  数据库总体信息

含实例、版本、是否RAC、CPU、物理内存、oracle内存设置等等

 2.  每秒每事务的资源消耗情况

 3.  实例的各组件的命中率

 4.  共享池总体情况(Shared Pool Statistics)

 5.  等待时间最长的前5个等待事件(Top 5 Timed Events)

含前5等待事件,两次采样间cpu占用,内存分配等信息。Oracle各版本等待事件并不完全相同,数量依版本升高而增加,关于各项等待事情的说明,三思之前的"学习动态性能表"系列文章中有过介绍,有心的朋友可以去搜搜看。

 6. DB 所有等待事件(Wait Events)

Total wait time>=0.001 的事件。

 7.  后台等待事件(Background Wait Events)

Total wait time>=0.001 的事件。

 8.  柱状显示的等待事件(Wait Event Histogram)

显示各等待事件不同响应时间的比例

 9.  根据CPU开销进行排序的SQL(SQL ordered by CPU)

10.  根据执行时间进行排序的SQL(SQL ordered by Elapsed)

11.  根据BufferGets进行排序的SQL(SQL ordered by Gets)

12.  根据物理读进行排序的SQL(SQL ordered by Reads)

13.  根据执行次数排序的SQL(SQL ordered by Executions)

14.  根据解析调用次数排序的SQL(SQL ordered by Parse Calls)

15.  实例记录的各项活动的统计数据(Instance Activity Stats)

16.  表空间的IO统计(Tablespace IO Stats)

17.  数据文件的IO统计(File IO Stats)

18.  数据文件读柱状图形式统计(File Read Histogram Stats)

19. Buffer 池统计数据(Buffer Pool Statistics)

含实例恢复的统计数据,buffer池大小设置建议等等。

20. PGA 统计数据(PGA Aggr Target Stats)

含PGA缓存命中率,柱状图形式的统计以及PGA设置建议等等。

21.  进程的内存占用情况(Process Memory Summary Stats)

含占用内存较多的进程等。

22. undo 段摘要

23. undo 段统计

24.  锁存器的当前情况

25.  锁存器睡眠等待统计

26.  锁存器失败情况

27.  数据字典cache性能统计(Dictionary Cache Stats)

28.  库缓存的活动情况(Library Cache Activity)

29. Rule 集(Rule Sets)

30.  共享池设置建议(Shared Pool Advisory)

31. SGA 摘要(SGA Memory Summary)

32. SGA 统计信息(SQL Memory Statistics)

33.  系统参数(init.ora Parameters)

  其报告过长, 限于篇幅,此处不再 罗列及 一一对照介绍,大家可以自己线下生成一份做对照理解。 由此 可以看到, Statspack 报告确实非常全面 。

  下面我们来看一下statspack都进行了什么操作。

    SQL> select s.text,s.line from user_source s where type=¨PACKAGE BODY¨ and NAME=¨STATSPACK¨;

  哇好长的代码,找到snap,发现有两个,procedure和function,主要的操作都在function中进行。通过查看我们发现,statspack.snap主要就是复制v$tables中的记录。然后我们再来分析一下spreport.sql的奥妙,o原来是调用sprepins.sql啊,再打开看看,哇嘞,更长更复杂,脚本套脚本。

  大致我们可以确认其是根据存储在stats$tables中的数据做分析,并进行一些运算,将结果输出。值的一提的是,sp*.sql中不少写法还是很有意思,执行逻辑运行巧妙,各种函数运用灵活,值的花时间深入研究体会呀:)

  这仅仅只是statspack自身的操作,至于根据其报告辅助分析,并做适当调优,那涉及到的东西就更多了。在我看来其报告可以分为两类来看,一类是优化业务逻辑,重点是根据9-14中罗列的各条SQL语句进行语句级调优,这可能跟你的业务逻辑关联紧密。另一类则是根据其它各项的报告,进行oracle体系结构上的调优,比如增加减少SGA、PGA缓存池大小啦,调整回滚段之类oracle自身设置达到优化目的。俺原本认为statspack不过是个辅助分析的小玩易儿,花个二三天功夫还不就轻松掌握了,但是分析了其生成原理之后,俺恍然意识到原来的认识太肤浅,初始配置下的statspack不过是个模板,如果你希望更强大的功能,或者想针对某方面进行调优,那你完全可以对其脚本做改造,打造满足你自己需求的statspack。但要实现这点就不只是说说这么简单了,u not only very clearly in statspack的存储、分析、运算了若指掌,but 要对oracle的各项机制及相互间的关联洞若观火(黑黑,什么都不懂也是种幸福啊,起码不用操心啦,有啥用啥呗) 。

  同样,如果你真的到了这个境界,那我想statspack对你而言又回到了原点,仅仅只是参考。佛教里有“见山是山,见水是水”,“见山不是山,见水不是山”,“见山还是山,见水还是水”三重境界,如此比对,一一深合其意啊。