oracle statspack学习

  

 

Statspack初步学和用

第一篇 安装初步    

 

  Statspack是一款功能强大的,免费的,oracle自带的性能分析工具。需要用具有sysdba权限的用户登陆进行安装。

 

C:\Documents and Settings\Administrator>sqlplus "/ assysdba"

 

SQL*Plus: Release 10.2.0.1.0 -Production on 星期三 9月 5 09:23:33 2007

 

Copyright (c) 1982, 2005, Oracle. All rights reserved.

 

连接到:

Oracle Database 10gEnterprise Edition Release 10.2.0.1.0 -Production

With the Partitioning, OLAP and Data Mining options

 

SQL>

SQL> show user;

 

USER is "SYS"

 

SQL> set lines 100

SQL> select file_name from dba_data_files;

 

FILE_NAME

----------------------------------------------------

 

F:\ORACLE\ORADATA\JSSWEB\SYSTEM01.DBF

F:\ORACLE\ORADATA\JSSWEB\UNDOTBS01.DBF

F:\ORACLE\ORADATA\JSSWEB\SYSAUX01.DBF

F:\ORACLE\ORADATA\JSSWEB\USERS01.DBF

F:\ORACLE\ORADATA\JSSWEB\JSSWEB.DBF

 

SQL> create tablespaceperfstat datafile 'f:\oracle\oradata\jssweb\perfstat.dbf' size 2000m;

此处需要注意创建的数据文件大小。Statspack的报表数据还是相当占空间的,特别是在多次连续采样的情况下。

 

 

表空间已创建。

 

SQL> @spcreate

执行statspack的安装包。该文件物理存放于$oracle_home\rdbms\admin\spcreate.sql

 

 

Choose the PERFSTAT user's password

-----------------------------------

Not specifying a password will result in the installation FAILING

 

输入 perfstat_password 的值: perfstat

perfstat

 

 

Choose the Default tablespace for the PERFSTAT user

---------------------------------------------------

Below is the list of online tablespaces in this database which can

store user data.  Specifyingthe SYSTEM tablespace for the user's

default tablespace will result in the installation FAILING, as

using SYSTEM for performance data is not supported.

 

Choose the PERFSTAT users's default tablespace.  This is the tablespace

in which the STATSPACK tables and indexes will be created.

 

TABLESPACE_NAME               CONTENTS  STATSPACK DEFAULTTABLESPACE

------------------------------ --------- ----------------------------

JSSWEB                        PERMANENT

PERFSTAT                      PERMANENT

SYSAUX                        PERMANENT *

USERS                         PERMANENT

 

Pressing <return> will result in STATSPACK's recommended default

tablespace (identified by *) being used.

输入用户默认的表空间。就是我们刚创建的那个,以及临时表空间。

 

输入 default_tablespace 的值: perfstat

..........

..........

输入 temporary_tablespace 的值: temp

..........

..........

NOTE:

SPCPKG complete. Please check spcpkg.lis for any errors.

安装完成后,系统会自动切换到perfstat用户下。安装过程中的日志被记录在spcpkg.lis。关于安装日志我看到网上不少文章中都提到其生成路径与spcreate.sql相同,但是我这里却给创建到my documents目录下了,不知道哪里设置日志存储路径。

如果安装过程中出现错误,可以通过执行@spdrop删除相关对象,然后检查日志,确认出错原因,再次执行@spcreate进行创建。

 

 

SQL> show user;

 

USER is "PERFSTAT"

 

ok,安装完成了~

 ============================================================================================================================

 

Statspack初步学和用

第二篇 使用初步    

 

 

以perfstat用户连接,如果你刚执行完@spcreate,则oracle默认将当前用户切换为perfstat。

首先生成两次采样。

 

SQL>execute statspack.snap

 

PL/SQL procedure successfully completed.

 

SQL>execute statspack.snap

 

PL/SQL procedure successfully completed.

 

执行@spreport生成报告(该文件物理存放路径与spcreate相同)。

 

SQL> @spreport

 

Current Instance

~~~~~~~~~~~~~~~~


   DB Id    DB Name    Inst Num Instance

----------- ------------ -------- ------------

 3398983194 JSSWEB              1 jssweb

 

 

 

Instances in this Statspack schema

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

 

   DB Id    Inst Num DB Name      Instance     Host

----------- -------- ------------ ------------ ------------

 3398983194        1 JSSWEB       jssweb       JSS

 

Using 3398983194 for database Id

Using          1 for instancenumber

 

 

Specify the number of days of snapshots to choose from

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Entering the number of days (n) will result in the most recent

(n) days of snapshots being listed. Pressing <return> without

specifying a number lists all completed snapshots.

 

 

 

Listing all Completed Snapshots

 

                                                      Snap

Instance     DB Name        Snap Id   Snap Started    Level Comment

------------ ------------ --------- ----------------- -------------------------

jssweb       JSSWEB               1 05 9月 2007 12:5     5

                                   9

                                 2 05 9月  2007 13:0    5

                                   2

 

 

输入采样的起始值和结束值,注意在生成报告的时候所选择的采样不能跨越一次停机(即stats$snapshot中STARTUP_TIME相同),不然会报错。

 

 

Specify the Begin and End Snapshot Ids

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

输入 begin_snap 的值: 1

Begin Snapshot Id specified: 1

 

输入 end_snap 的值: 2

End   Snapshot Id specified: 2

 

 

 

Specify the Report Name

~~~~~~~~~~~~~~~~~~~~~~~

The default report file name is sp_1_2.  To use this name,

press <return> to continue, otherwise enter an alternative.

 

输入 report_name 的值: d:\report.txt

报告文件的输出路径。

 

 

................

................

................

 

undo_tablespace              UNDOTBS1

user_dump_dest               F:\ORACLE\PRODUCT\10.2.0\ADMIN\JS

         -------------------------------------------------------------

 

End of Report ( d:\report.txt )

 

从生成采样到生成报告的大致操作步骤就是这样,当然我们这样操作在实际业务过程中是不现实的,主要的问题有以下几条:

1、采样生成间隔时间太短,未必能真正体现出服务器在业务实际运行中的状态,并且时间太短的情况下,可能statspack运行本身都会对分析结果的生成造成影响,毕竟statspack也是在运行一堆sql,也会被计入统计范围内。

2、采样的频度太低,以上述为例仅执行两次,以此为基准生成的报告恐怕也真的是仅供参考。

 

解决上述问题,我们按照如下步骤实施:

1、创建一个job,我们设定其每个小时自动收集一次采样。

 

Variable job number;

begin

  dbms_job.submit(:job,'statspack.snap;',trunc(sysdate+1/24,'hh24'),'trunc(sysdate+1/24,''hh24'')');

  commit;

end;

/

 

查看当前job

SQL> select job,schema_user,next_date,interval,what fromuser_jobs

 

       JOB SCHEMA_USENEXT_DATE      INTERVAL                       WHAT

---------- ---------- -------------- -----------------------------------------------------

        44 PERFSTAT   11-9月 -07    trunc(SYSDATE+1/24,'HH')      statspack.snap;

 

 

2、考虑到采样结果还是相当占空间,不能让其一直执行下去,我们再创建一个job,让它在明天凌晨自动停止采样job的执行。

 

 

Variable job number;

begin

  dbms_job.submit(:job,'dbms_job.broken(44,true);',trunc(sysdate+1),'null');

  commit;

end;

/

Ok,竣工,等上几个小时,看看采样生成的怎么样了。

 

SQL> select snap_id,snap_time,startup_time from stats$snapshot;

 

   SNAP_ID SNAP_TIME           STARTUP_TIME

---------- ------------------- -------------------

        11 2007-09-11 11:00:032007-09-11 09:16:05

        12 2007-09-11 12:00:032007-09-11 09:16:05

        13 2007-09-11 13:00:042007-09-11 09:16:05

         1 2007-09-10 12:59:562007-09-10 09:04:22

         2 2007-09-10 13:02:012007-09-10 09:04:22

 

 

重新执行@spreport,再生成一份报告看看吧。

 

如果你想删除某些statspack收集的历史采样,直接通过delete,指定snap_id即可:

SQL> delete stats$snapshot where snap_id=1;

 

已删除 1 行。

 

SQL> select snap_id,snap_time,startup_time from stats$snapshot;

 

   SNAP_ID SNAP_TIME           STARTUP_TIME

---------- ------------------- -------------------

        11 2007-09-11 11:00:032007-09-11 09:16:05

        12 2007-09-11 12:00:032007-09-11 09:16:05

        13 2007-09-11 13:00:042007-09-11 09:16:05

         2 2007-09-10 13:02:012007-09-10 09:04:22

SQL>

 

如果你想删除所有的采样数据但保留statspack的库结构,oracle也提供了脚本,执行@sptrunc即可。该脚本是通过truncate删除各表记录,效率比delete高很多。

如果你想彻底干掉本机安装的statspack的话,那就更简单了,执行@spdrop,干净不留痕:)。

 

 

注:如果你在执行@spxxx的时候报SP-0310错误,可能是SQLPATH路径未设,你可以通过三种方式解决:

1、本地设置SQLPATH:

F:\> SET SQLPATH=F:\oracle\product\10.2.0\db_1\RDBMS\ADMIN

如果用这种方式的话,本次会话结束SQLPATH就失效了,下次打开还得再次设置。

 

2、设置注册表(linux环境的话就设置环境变量):

开始->运行->regedit

HKEY_LOCAL_MACHINE->SOFTWARE->ORACLE->KEY_ORADB10G->新建字符串值SQLPATH,数值数据:F:\oracle\product\10.2.0\db_1\RDBMS\ADMIN

 

3、指定全路径:

SQL> @F:\oracle\product\10.2.0\db_1\RDBMS\ADMIN\spreport.sql

SQL> @%ORACLE_HOME%\RDBMS\ADMIN\spreport.sql

 =========================================================================================================================

 

 

Statspack初步学和用

第三篇 分析初步 

 

Statspack报告分为如下部分:

 1. 数据库总体信息

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

 

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

 

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

 

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

 

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

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

 

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

Total waittime>=0.001的事件。

 

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

Total waittime>=0.001的事件。

 

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

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

 

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

 

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

 

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

 

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

 

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

 

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

 

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

 

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

 

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

 

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

 

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

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

 

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

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

 

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

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

 

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='PACKAGEBODY' 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对你而言又回到了原点,仅仅只是参考。佛教里有“见山是山,见水是水”,“见山不是山,见水不是山”,“见山还是山,见水还是水”三重境界,如此比对,一一深合其意啊。

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值