分类:
2008-10-28 18:17:08
参考:《statspack使用指南-v3[1].0.pdf》。
一. 系统参数
1. job_queue_processes
[alter system set job_queue_processes = 6 scope=both;]
2. timed_statistics
alter system set timed_statistics = true scope=memory;
二. 安装Statspack
安装Statspack 需要用internal 身份登陆,或者拥有SYSDBA(connect / as sysdba)权限的用户登陆。需要在本地安装或者通过telnet 登陆到。
在8.1.6 版本中运行statscre.sql;在8.1.7 以上版本中运行spcreate.sql。
首先登陆到数据库,最好转到$ORACLE_HOME/RDBMS/ADMIN 目录,这样我们执行脚本就可以方便些。
SQL> @spcreate
三. 安装好的Statspack
运行begin statspack.snap;end;/ 可以产生系统快照,运行两次,然后执行spreport.sql 就可以生成一个基于两个时间点的报告。如果一切正常,说明安装成功。
四. 规划自动任务
Statspack 正确安装以后,我们就可以设置定时任务,开始收集数据了。可以使用spatuo.sql 来定义自动任务。
先来看看spauto.sql 的关键内容:
dbms_job.submit(:jobno, 'statspack.snap;',trunc(sysdate+1/24,'HH'),trunc(SYSDATE+1/24,''HH'')', TRUE, :instno);
这个job 任务定义了收集数据的时间间隔:
一天有24 个小时,1440 分钟,那么:
1/24 HH 每小时一次
1/48 MI 每半小时一次
1/144 MI 每十分钟一次
1/288 MI 每五分钟一次
SQL> @spauto
关于采样间隔,我们通常建议以1 小时为时间间隔,对于有特殊需要的环境,可以设置更短的,如半小时作为采样间隔,但是不推荐更短。因为statspack 的执行本身需要消耗资源,对于繁忙的生产系统,太短的采样对系统的性能会产生较大的影响(甚至会使statspack 的执行出现在采样数据中)。
五. 生成分析报告
调用spreport.sql 可以生成分析报告:
SQL> @spreport
一个statspack 的报告不能跨越一次停机,但是之前或之后的连续区间,收集的信息依然有效。你可以选择之前或之后的采样声称report。
六. 移除定时任务
execute dbms_job.remove(1)
当你完成了一个采样报告,你应该及时移除这个job 任务,在生产环境中,遗漏一个无人照顾的job 是非常危险的,如果statspack 运行一个星期,采样的数据量是非常惊人的。有的生产企业因疏忽而当机!
七. 删除历史数据
删除stats$snapshot 数据表中的相应数据,其他表中的数据会相应的级连删除:
SQL> select max(snap_id) from stats$snapshot;
MAX(SNAP_ID)
------------
166
SQL> delete from stats$snapshot where snap_id < = 166;
143 rows deleted
你可以更改snap_id 的范围以保留你需要的数据。
在以上删除过程中,你可以看到所有相关的表都被锁定。
Oracle 还提供了系统脚本用于Truncate 这些统计信息表,这个脚本名字是: sptrunc.sql (8i、9i 都相同)该脚本主要内容如下,里面看到的就是statspack 相关的所有系统表:
如果采样了大量的数据,直接Delete 是非常缓慢的,可以考虑使用上述SQL 截断所有表。
调整STATSPACK 的收集门限
Statspack 有两种类型的收集选项:
级别(level):控制收集数据的类型
门限(threshold):设置收集的数据的阈值。
1.级别(level)
Statspack 共有三种快照级别,默认值是5
a.level 0: 一般性能统计。包括等待事件、系统事件、系统统计、回滚段统计、行缓存、SGA、会话、
锁、缓冲池统计等等。
b.level 5: 增加SQL 语句。除了包括level0 的所有内容,还包括SQL 语句的收集,收集结果记录在
stats$sql_summary 中。
c.level 10: 增加子锁存统计。包括level5 的所有内容。并且还会将附加的子锁存存入
stats$lathc_children 中。在使用这个级别时需要慎重,建议在Oracle support 的指导下进行。
可以通过statspack 包修改缺省的级别设置
SQL>execute statspack.snap(i_snap_level=>0,i_modify_parameter=>’true’);
通过这样的设置,以后的收集级别都将是0 级。
如果你只是想本次改变收集级别,可以忽略i_modify_parameter 参数。
SQL>execute statspack.snap(i_snap_level=>10);
2.快照门限
快照门限只应用于stats$sql_summary 表中获取的SQL 语句。
因为每一个快照都会收集很多数据,每一行都代表获取快照时数据库中的一个SQL 语句,所以
stats$sql_summary 很快就会成为Statspack 中最大的表。
门限在stats$statspack_parameter 表中。让我们了结一下各种门限:
a. executions_th 这是SQL 语句执行的数量(默认值是100)
b. disk_reads_tn 这是SQL 语句执行的磁盘读入数量(默认值是1000)
c. parse_calls_th 这是SQL 语句执行的解析调用的数量(默认值是1000)
d. buffer_gets_th 这是SQL 语句执行的缓冲区获取的数量(默认值是10000)
任何一个门限值超过以上参数就会产生一条记录。
通过调用statspack.modify_statspack_parameter 函数我们可以改变门限的默认值。
例如:
SQL>execute statspack.modify_statspack_parameter(i_buffer_gets_th=>100000,i_disk_reads_th=>100000;