天天看点

statspack应用指南

参考:《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 登陆到服务器。

在Oracle8.1.6 版本中运行statscre.sql;在Oracle8.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;