服务热线:13616026886

技术文档 欢迎使用技术文档,我们为你提供从新手到专业开发者的所有资源,你也可以通过它日益精进

位置:首页 > 技术文档 > 数据库技术 > Oracle技术 > Oracle开发 > 查看文档

教你轻松掌握statspack报表的使用方法 (1)

"statspack"的一些使用技巧:

一 怎样修改statspack的脚本产生自定义报表?

通常statspack报表可以满足大部分的需要,有时我们需要对产生报表的脚本进行一些微小的修改,这样产生的报表将会更有用途。

比如说某些sql很多,但在statspack产生的报表中,每个sql只显示5行,结果有些比较长的sql就只能看到一部分;又如在top events部分,标准的报表只显示top 5,其实我们可以显示更多的events,那如何修改呢?用编辑工具(在linux下用vi)打开($oracle_home/rdbms/admin/sprepins.sql)

define top_n_events = 5;      // top 5 events
define top_n_sql = 65;        // top sql
define top_n_segstat = 5;     // top 5 segstat
define num_rows_per_hash=5;   // 每个sql显示5行

就看到在该脚本中已经定义了一些常数,我们只需要把它改为我们需要的值。

define top_n_events = 10;     // top 10 events     
define top_n_sql = 65;    // top sql          
define top_n_segstat = 10;  // top 10 segstat    
define num_rows_per_hash=10; // 每个sql显示10行

修改后,我们就可以看到效果了.

二 如何用statspack的报表确定热表及索引?

如果想用statspack表确定热表及索引,必须修改statspack快照的收集级别,8i中statspack共有三种快照级别,默认值是5。

select * from stats$level_description;
snap_level description
---------- -------------------------

0 一性性能统计:包含回退段状态、字典缓存、sga、系统事件、后台事件、会话事件、系统统计、等待统计、锁统计、闩锁统计。

5 增加了收集sql的信息、并包括0级收集的信息。

10 增加了收集子闩锁的信息,并包括所有低级别的信息。

在9i中statspack共有五种快照级别,默认值是5。

select * from stats$level_description;
snap_level description
---------- ----------------------------

0 一性性能统计:包含回退段状态、字典缓存、sga、系统事件、后台事件、会话事件、系统统计、等待统计、锁统计、闩锁统计

5 增加了收集sql的信息、并包括0级收集的信息。

6 增强了在sql收集信息方面的功能(列出占用资源较高的sql),并包所有低级别的信息。

7 增加了收集段级别的统计信息(如段的逻辑读与物理读、行锁、itl及buffer busy waits),

并包括所有低级别的信息。

10 增加了收集子闩锁的信息,并包括所有低级别的信息。

如果你收用statspack确定热表及热索引,那就需要使用7/10的级别来收集快照。

//通过这样的设置,以后的收集级别都将是7级。

//如果你只是想本次改变收集级别,可以忽略i_modify_parameter参数。

sql>execute statspack.snap(i_snap_level=>7,i_modify_parameter=>true); 
sql>execute statspack.snap(i_snap_level=>7);

修改完收集级别后,那大家就可以根据自己的需要设定收集的频率,现在我们只需要注意statspack报表中的“段级别的统计信息”:

top 5 logical reads per segment for db: esal  instance: esal  snaps: 2368 -2380
-> end segment logical reads threshold: 10000
                                           subobject  obj.       logical
owner      tablespace object name          name       type         reads  %total
---------- ---------- -------------------- ---------- ----- ------------ -------
cybercafe  ts_cyberca agent_card_type                 table  115,220,864   18.07
cybercafe  ts_cyberca game_card_type                  table   79,103,600   12.40
cybercafe  ts_cyberca agent_task                      table   57,030,304    8.94
cybercafe  ts_cyberca agent_price_level_ow            table   46,393,968    7.28
cybercafe  ts_cyberca idx_asl_reslog_id               index   23,261,600    3.65
---------------------------------------------------------
top 5 physical reads per segment for db: esal  instance: esal  snaps: 2368 -2380
-> end segment physical reads threshold:    1000
                                           subobject  obj.      physical
owner      tablespace object name          name       type         reads  %total
---------- ---------- -------------------- ---------- ----- ------------ -------
cybercafe  ts_cyberca agent_game_card_gm13            table       76,476    7.36
cybercafe  ts_cyberca agent_sale_log       asl_200500 table       61,270    5.89
cybercafe  ts_cyberca reseller_log         rl_200412  table       48,950    4.71
cybercafe  ts_cyberca agent_game_card_gm14            table       46,259    4.45
cybercafe  ts_cyberca agent_capital_log    acl_200500 table       45,476    4.37
-------------------------------------------------------------
top 5 buf. busy waits per segment for db: esal  instance: esal  snaps: 2368 -2380
-> end segment buffer busy waits threshold:     100
                                           subobject  obj.   buffer busy
owner      tablespace object name          name       type         waits  %total
---------- ---------- -------------------- ---------- ----- ------------ -------
cybercafe  ts_cyberca agent_task                      table           22   36.07
cybercafe  ts_cyberca agent_card_type                 table            9   14.75
cybercafe  ts_cyberca idx_resacc_updtime              index            5    8.20
cybercafe  ts_cyberca agent_sale_log       asl_200501 table            4    6.56
cybercafe  ts_cyberca idx_acl_acpital_logi            index            4    6.56
-------------------------------------------------------------
top 5 row lock waits per segment for db: esal  instance: esal  snaps: 2368 -2380
-> end segment row lock waits threshold:     100
                                           subobject  obj.      row lock
owner      tablespace object name          name       type         waits  %total
---------- ---------- -------------------- ---------- ----- ------------ -------
cybercafe  ts_cyberca idx_apl_gctid2       apl_200501 index           54   24.77
cybercafe  ts_cyberca idx_rb_reseller_id              index           41   18.81
cybercafe  ts_cyberca idx_rl_reslog_id                index           38   17.43
cybercafe  ts_cyberca idx_act_act_id                  index           17    7.80
cybercafe  ts_cyberca idx_service_id                  index           14    6.42
-------------------------------------------------------------

在这里可以看到逻辑读/物理读/缓存忙/行锁符合条件的一些对象,通过这些对象,可以确定热的表及索引,然后分析如何对业务进行优化,降低对这些表的访问量等。如果你觉得显示top 5 segment不够的话,可以按一所述修改top_n_segstat,然后就可以显示更多的符合条件的对象,然后将这些热表放到keep池中。

三 如何用statspack的报表确定keep池与default池的分配?

如果你想使用default池与keep池,在9i中需要分配db_cache_size及db_keep_cache_size参数,但如何确定它们的大小呢?我们可以根据2所示的一些热表,计算热表放入keep池需要的内存,然后用将表放入相应的pool中。

alter table &table_name storage(buffer_pool &buffer_pool);

将确定的热表放入keep中之后,然后收集一段时间后再产生一个新的报表:

buffer pool statistics for db: esal  instance: esal  snaps: 2277 -2289
-> standard block size pools  d: default,  k: keep,  r: recycle
-> default pools for other block sizes: 2k, 4k, 8k, 16k, 32k
                                                           free    write  buffer
     number of cache      buffer    physical   physical  buffer complete    busy
p      buffers hit %        gets       reads     writes   waits    waits   waits
--- ---------- ----- ----------- ----------- ---------- ------- --------  ------
d      128,128  99.7 482,298,597   1,557,980    265,662       0        0      88
k       32,032 100.0 372,560,023      13,951     42,405       0        0      17
-------------------------------------------------------------

确定keep池与default的需要内存时,可以根据这一部分对keep池与default池的大小进行评估,如果k所标识的cache hit%比较小,说明keep池不足,如果d显示的cache hit%比较小,说明default池分配怀足,如果k是的default显示是100%,那们可以将更多的热表放入到keep池中,然后经过一段时间的调整,相信可以将default池与keep池调到一个相对比较合适的集团。

四 如何用crontab定期产生statspack的报表?

看了一段时间的statspack报表后,就懒于每天手工去产生一个报表,那如何产系统自动产生一个报表呢?

经过测试,用crontab可以方便地产生报表,然后通过sendmail直接发到相关人员的邮箱中。

[oracle@www1 sql]$ more backup/auto_send_perf.sh 
#!/bin/sh
. ~oracle/.bash_profile

/home/oracle/product/9.2.0/bin/sqlplus -s aaa/bbb@ccc<<!
set head off
set timing off
spool /home/oracle/sql/backup/snap_begin.lst
select min(snap_id) snap_id
 from stats$snapshot
where snap_time between trunc(sysdate) and trunc(sysdate)+1;
spool off
spool /home/oracle/sql/backup/snap_end.lst
select max(snap_id) snap_id
 from stats$snapshot
where snap_time between trunc(sysdate) and trunc(sysdate)+1;
spool off
exit
!

begin_snap=`cat /home/oracle/sql/backup/snap_begin.lst | tail -n 2`
end_snap=`cat /home/oracle/sql/backup/snap_end.lst | tail -n 2`
#end_snap=`expr $begin_snap + 13`
report_name=/home/oracle/sql/report/sp`date +%m%d`_ac

/home/oracle/product/9.2.0/bin/sqlplus -s aaa/bbb@ccc<<!
define begin_snap=$begin_snap
define end_snap=$end_snap
define report_name=$report_name
@?/rdbms/admin/spreport
exit
!

mail -s "perfstat report" ddd@eee.fff 
< /home/oracle/sql/report/sp`date +%m%d`_ac.lst

[oracle@www1 sql]$crontab -l
* 21 * * * /home/oracle/sql/backup/auto_send_perf.sh >> 
/home/oracle/sql/backup/perf.lst 2>&1

注释:早上8点至晚上8点之间进行快照收集,9点执行cron进程启动,产生报表的快照也限于当天收集的快照,将当天最小的snap_id与最大的snap_id放到两个文件中,在sheel中读出,并计算出一个报表名称,

最后产生的报表通过"sendmail"发送到相关人员的邮箱,此后每晚只需要收邮件就即以看到当天的报表。

扫描关注微信公众号