| « | 三月 2010 | » | ||||
|---|---|---|---|---|---|---|
| 一 | 二 | 三 | 四 | 五 | 六 | 日 |
| 1 | 2 | 3 | 4 | 5 | 6 | 7 |
| 8 | 9 | 10 | 11 | 12 | 13 | 14 |
| 15 | 16 | 17 | 18 | 19 | 20 | 21 |
| 22 | 23 | 24 | 25 | 26 | 27 | 28 |
| 29 | 30 | 31 | ||||
xzh2000 | 17 一月, 2005 19:59
1 如何修改statspack的脚本产生自定义报表?
2 如何用statspack的报表确定热表及索引?
3 如何用statspack的报表确定keep池与default池的分配?
4 如何用crontab定期产生statspack的报表?
使用statspack有相当长的时间啦,从最初的推崇,到后来的否定,
再到现在的肯定,发现它已经是我工作中不可缺少的一部分,
每晚上读当天产生的statspack报表就成了一种习惯,
越是读得认真,越是觉得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发送到相关人员的邮箱,然后每天晚只需要收邮件就可以看到当天的报表啦。
一点整理的statspack内容信息
Instance Efficiency Percentages
Data Buffer Hit Ratio#<#90#数据块在数据缓冲区中的命中率,通常应该在90%以上,否则考虑加大 db_block_buffers(9i 以上可是db_cache_size)
Buffer Nowait Ratio#<#99#在缓冲区中获取buffer 的未等待比率
Library Hit Ratio#<#98#主要代表着sql在共享区的命中率,通常在98%以上
In Memory Sort Ratio#<#0#如果过低说明有大量的排序在临时表空间中进行,可尝试增加sort_area_size
Redo Nowait Ratio#<#98#写日志的不等待比率,太低可调整log_buffer(增加)和 _log_io_size(减小,默认为1/3*log_buffer/log_block_size,使得 _log_io_size 为合适的值,比如128k/log_block_size)
Soft Parse Ratio#<#90#近似当作sql在共享区的命中率,通常高代表使用了绑定变量,太低需要调整应用使用绑定变量,或者参考 cursor_sharing = force (9i 中增加了 similar )
Latch Hit Ratio#<#99#内部结构维护锁命中率,高于99%,通常低是因为shared_pool_size过大和没有使用绑定变量导致硬解析过多,可参考 _spin_count 参数设置
Percent Non-Parse CPU#<#95#查询实际运行时间/(查询实际运行时间+sql解析时间),太低表示解析消耗时间过长
Percent Parse CPU to Parse Elapsed#<#90#解析实际所用时间/(解析实际所用时间+解析中等待资源时间),越高越好
Execute to Parse Percent#<#10#该值越高表示一次解析后被重复执行的次数越多,如果过低可以考虑设置 session_cached_cursors > 0
Memory Usage Percent#<#75#共享池的使用率,应该稳定在75%--90%之间,太小浪费内存,太大则显内存不足
Percent of SQLs with Execution>1#<#40#执行次数大于1的sql的比率(若太小可能是没有使用绑定变量)
Percent of Memory for SQl with Execution>1#<#0#执行次数大于1的sql消耗内存/(所有sql消耗内存)
Instance Load Profile
Redo Size/Sec#>#100000#每秒产生的日志大小(单位字节),可标志数据库任务的繁重与否
Redo Size/Tx#>#0#平均每个事务的日志生成量
Logical Reads/Sec(逻辑读)#>#0#平均每秒产生的逻辑读,单位是block
Logical Reads/Tx#>#0#平均每个事务产生的逻辑读,单位是block
Block Changes/Sec#>#100#每秒block变化数量,数据库事务带来改变的块数量
Block Changes/Tx#>#0#平均每个事务所导致的改变的块数
Physical Reads/Sec#>#100#平均每秒数据库从磁盘读取的block数
Physical Reads/Tx#>#0#平均每个事务从磁盘读取的block数
Physical Write/Sec#>#50#平均每秒写磁盘的block数
Physical Write/Tx#>#0#平均每个事务写磁盘的block数
User Calls/Sec#>#0#每秒用户call次数
User Calls/Tx#>#0#每事务用户call次数
Parses/Sec#>#100#每秒解析次数,近似反应了每秒语句的执行次数
Parses/Tx#>#0#每事务产生的解析次数
Hard Parses/Sec#>#10#每秒产生的硬解析次数
Hard Parses/Tx#>#0#每事务产生的硬解析次数
Sorts/Sec#>#20#每秒产生的排序次数
Sorts/Tx#>#5#每事务产生的排序次数
Transactions/Sec#>#0#每秒产生的事务数
Rows/Sort#>#0#每次排序所涉及到的行数
Percent of Block Changed/Read#>#0#发生变化的块数/读次数,变化的块需要从回滚段来数据
Recursive Call Percent#>#0#递归操作占所有操作的比率
Rollback/Tx Percent#>#5#事务回滚率(回滚开销很大)
Executes/Sec#>#0#每秒执行次数
Execute/Tx#>#0#每个事务执行次数
--45: Logons/Sec
--46: Logons/Tx
I/O Statistics(I/O统计数据)
Table Space I/O#>#0#表示各表空间在IO上的分布,若出现严重不均衡,则要重新考虑对象的存储规划和表空间中数据文件的磁盘规划
Datafile I/O#>#0#表示各数据文件的IO分布,若不均衡则需要重新考虑对象的存储规划
Table I/O(表I/O)#>#0#对这些IO很大的表,要考虑放置在高速磁盘上,并且尽可能的分布在不同的磁盘上
TOP SQL
Top SQL with High Buffer Gets#>#0#这类sql进行了大量的block的读,要检查该sql是否用到了索引,或者说表上是否存在合理的索引,对于必须全表扫描的大表可以考虑recycle buffer ,对于频繁进行全表扫描的小表可以考虑keep buffer,还有一种需要注意的情况就是如果通过索引获取数据比例占表数据比例过大,比如20%(举例数据),就能导致buffer gets过大
Top SQL with High Physical Reads#>#0#这类sql导致了大量的从磁盘获取数据,可能因为数据缓冲区太小,也可能是过多的全表扫描,需要考察索引是否合理,是否用到索引
Top SQL with High Execution Count#>#0#这类sql是需要重点关注的,也许这些sql本身一次执行并没有消耗大量的时间或者空间,但由于频繁的执行对系统影响极大,所以只要有优化的可能到要对这些sql进行优化。还有另外一些情况,就是某些程序中可能大量频繁地使用dual表来获取一些信息(比如时间的计算等),尽可能的使这类sql转化为应用本地能解决的函数,或者还存在一些由于设计上的缺陷导致不必要的查询,都要在设计的角度避免这些查询
Top SQL with High Shared Memory#>#0#这类sql使用了大量的内存,不一定执行的频繁,但是它可能把执行的频繁的sql涉及的一些数据挤出缓冲区,这同样将导致很多问题,所以也需要从尽可能的优化
Top SQL with High Version Count#>#20#表示多个用户的sql在字面上是一样的,或者sql虽然一样但是session的一些参数发生了改变(比如sort_area_size发生了变化)
Wait Events(等待事件)
alter system set mts_dispatcher#>#0#当会话决定执行"ALTER SYSTEM SET MTS_DISPATCHERS = <string> "的时候等待DISPATCHERS的启动
BFILE check if exists#>#0#检查外部的bfile文件是否存在
BFILE check if open#>#0#检查外部的bfile文件是否已经open
BFILE closure#>#0#等待关闭外部bfile文件
BFILE get length#>#0#获得外部bfile文件的大小
BFILE get name object#>#0#得到外部bfile文件的名字
BFILE get path object#>#0#得到外部bfile文件的路径
BFILE internal seek#>#0#
BFILE open#>#0#等待外部bfile被打开
BFILE read#>#0#等待外部bfile文件读取完毕
buffer busy due to global cache#>#0#
buffer busy waits#>#0#block正被读入缓冲区或者缓冲区正被其他session使用,出现此情况通常可能通过几种方式调整:增大data buffer,增加freelist,减小pctused,增加回滚段数目,增大initrans,考虑使用LMT
buffer deadlock#>#0#由于系统缓慢所产生而非应用产生了死锁
buffer latch#>#0#会话等待'buffer hash chain latch'
buffer read retry#>#0#OPS下读buffer的过程中内容发生了变化于是重新读取
Cache simulator heap#>#0#
checkpoint completed#>#0#等待检查点的完成,通常出现这个问题的原因是IO问题严重,可调整跟检查点相关参数log_checkpoint_interval,log_checkpoint_timeout,db_block_max_dirty_target,fast_start_io_target 等,可间接的增大日志文件大小和增加日志文件组数
Contacting SCN server or SCN lock master#>#0#
control file parallel write#>#0#等待写所有控制文件的完成,可将控制文件分散在不同的磁盘上
control file sequential read#>#0#读控制文件,在备份控制文件、OPS等情况下产生
control file single write#>#0#OPS下同一时刻只允许一个session将共享信息写入磁盘
conversion file read#>#0#
db file parallel read#>#0#做恢复的并行从数据文件获取数据
db file parallel write#>#0#当多个IO可以同时发生时(多磁盘),DBWR可并行写入,DBWR等待最后一个IO的完成
db file scattered read#>#0#一次获取的block被分散在buffer的不连续空间中,通常表示全表扫描过多,可检查应用程序是否合理的使用了索引,数据库是否合理的创建了索引
db file sequential read#>#0#通常暗示着通过索引获取数据量比较大(比如通过索引进行范围扫描获取表数据百分比过大),多表连接的时候连接顺序不当,hash join时hash_area_size无法容纳hash table
db file single write#>#0#更新数据文件头出现等待
debugger command#>#0#
DFS db file lock#>#0#OPS下每个实例在数据文件上有一个共享的全局锁,当要offline数据文件的时候等候其他实例同步文件
DFS lock handle#>#0#会话等待一个全局锁请求
direct path read#>#0#通常发生在临时表空间排序、并行查询中
direct path read (lob) #>#0#
direct path write#>#0#direct方式导入数据(sqlldr,CTAS)、PDML、临时表空间排序
direct path write (lob)#>#0#
dispatcher listen timer#>#0#
dispatcher shutdown#>#0#
dispatcher timer#>#0#
DLM generic wait event#>#0#
dupl. cluster key#>#0#
enqueue#>#0#对共享资源的获取要求一种排队(FIFO)的机制以保护共享资源,ST enqueue表示空间分配或者释放导致的问题可采用LMT表空间来避免,TX enqueue主要产生于唯一索引重复、bitmap index 的频繁更新、initrans太小或者pctfree过小
file identify#>#0#
file open#>#0#
free buffer waits#>#0#在缓冲区中寻找可用buffer出现等待,可能数据缓冲区太小,也可能检查点间隔太长,也可能频繁的DML而IO成为瓶颈
free global transaction table entry#>#0#分布式数据库中会话等待一个全局事务槽
free process state object#>#0#
global cache bg acks#>#0#
global cache cr request#>#0#
global cache freelist wait#>#0#
global cache lock busy#>#0#会话等待将一个buffer从当前共享状态转换为当前独占状态
global cache lock cleanup#>#0#
global cache lock null to s#>#0#
global cache lock null to x#>#0#
global cache lock open s#>#0#
global cache lock open x#>#0#
global cache lock s to x#>#0#
global cache multiple locks#>#0#
global cache pending ast#>#0#
global cache pending asts#>#0#
global cache retry prepare#>#0#
global cache retry request#>#0#
imm op#>#0#
inactive session#>#0#
inactive transaction branch#>#0#
index block split#>#0#当在索引中查找一个key的时候如果发现该索引block正在裂变则等待裂变完成
io done#>#0#会话等待IO的完成
KSIM GDS request cancel#>#0#
latch activity#>#0#
latch free#>#0#latch是一种维护内存的锁,不采用排队机制,快速的获取然后很快释放,造成的原因通常有程序没有使用绑定变量、shared_pool_size设置过大(比如1G)、LRU竞争、某些块过热(访问太频繁)
LGWR wait for redo copy#>#0#表示等待redo allocation and redo copy latches,可增加 _log_simulteneous_copies(默认为 2*CPUs),但同时也容易引入redo allocation latch contention,所以需要慎重
library cache load lock#>#0#
library cache lock#>#0#
library cache pin#>#0#
listen endpoint status#>#0#
LMON wait for LMD to inherit communication channels#>#0#
local write wait#>#0#
lock manager wait for dlmd to shutdown#>#0#
lock manager wait for remote message#>#0#
log buffer space#>#0#生成日志等待lgwr赶快写文件而腾出log buffer,可在init参数文件中增大 log_buffer,放置日志文件于高速磁盘上
log file parallel write#>#0#当lgwr写日志文件的过程中出现等待,这个等待通常会导致 log file sync事件,放置日志文件于高速磁盘上
log file sequential read#>#0#
log file single write#>#0#
log file switch (archiving needed)#>#0#当日志切换的时候由于日志组循环使用了一圈但日志归档还没有完成,通常是io有严重问题,可增大日志文件和增加日志组,调整log_archive_max_processes
log file switch (checkpoint incomplete)#>#0#当日志切换的时候由于日志组循环使用了一圈但将被使用的日志组中的checkpoint还没有完成造成,通常是io有严重问题,可增大日志文件和增加日志组
log file switch (clearing log file)#>#0#
log file switch completion#>#0#
log file sync#>#0#当用户commit的时候通知lgwr写日志但lwgr正忙,造成的可能原因是commit太频繁或者lgwr一次写日志时间太长(可能是因为一次log io size 太大),可调整 _log_io_size,结合log_buffer,使得 (_log_io_size*db_block_size)*n = log_buffer,这样可避免和增大log_buffer引起冲突;放置日志文件于高速磁盘上
write complete waits#>#0#用户等候buffer被写进文件,暗示着写数据文件等待
| statspack分析 Load Profile ~~~~~~~~~~Per Second Per Transaction --------------- --------------- Redo size: 22,007.09 2,921.10 --很重要的参数,表示你数据变更频率 Logical reads: 22,890.62 3,038.38 Block changes: 95.88 12.73 Physical reads: 5,413.37 718.54 Physical writes: 5.67 0.75 User calls: 750.85 99.66 Parses: 183.20 24.32 ----软解析每秒超过300次意味着你的"应用程序"效率不高, 没有使用soft soft parse,调整session_cursor_cache Hard parses: 20.41 2.71 --每秒超过100次,就可能说明你绑定使用的不好 Sorts: 5.17 0.69 Logons: 0.03 0.00 Executes: 185.17 24.58 Transactions: 7.53 % Blocks changed per Read: 0.42 Recursive Call %: 21.95 --如果有很多PLSQL,那么他就会比较高 Rollback per transaction %: 0.01 Rows per Sort: 159.13 --看回滚率是不是很高,因为回滚很耗资源 Instance Efficiency Percentages (Target 100%) --这一部分通过可以提前找出ORACLE潜在将要发生的性能问题(所以很重要哦) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Buffer Nowait %: 99.71 Redo NoWait %: 100.00 --Buffer Nowait<99%说明,有可能是有热块(查找x$bh的 tch和v$latch_children的cache buffers chains) Buffer Hit %: 76.54 In-memory Sort %: 100.00 --Buffer Hit<95%,重要的参数,小于95%可能是要加db_cache_size,但是大量的非选择的索引也会造成该值很高(大量的db file sequential read) Library Hit %: 97.07 Soft Parse %: 88.86 --Library Hit<95%,要考虑加大共享池,绑定变量,修改cursor_sharing等 Execute to Parse %: 1.06 Latch Hit %: 99.76 --Soft Parse<95%,需要考虑到绑定,如果低于80%,那么就可能sql基本没有被重用 Parse CPU to Parse Elapsd %: 89.28 % Non-Parse CPU: 91.37 --Latch Hit<99%,要确保>99%,否则存在严重的性能问题,比如绑定等会影响该参数 如果一个经常访问的列上的索引被删除,可能会造成buffer hit 显著的下降 如果增加了索引,但是他影响了ORACLE正确的选择表连接时的驱动顺序,那么可能会导致buffer hit 显著增高 如果你的命中率变化幅度很大,说明你要改变SQL模式 Shared Pool Statistics Begin End ------ ------ Memory Usage %: 89.18 85.56 --共享内存使用情况 70%-98%都在正常范围 % SQL with executions>1: 36.31 36.10 -- % Memory for SQL w/exec>1: 38.86 38.33 Top 5 Timed Events ~~~~~~~~~~~~~~~~~~ % Total Event Waits Time (s) Ela Time -------------------------------------------- ------------ ----------- -------- CPU time 2,913 32.01 db file sequential read 2,142,279 2,820 30.99 db file scattered read 1,724,832 1,183 13.00 buffer busy waits 198,624 1,042 11.44 log file sync 22,857 915 10.06 TIMED_STATISTICS = TRUE 那么等待事件按等待的时间排序 = FALSE那么事件按等待的数量排序 常见事件 LOG FILE SYNC: 在每次提交时都出现,如果这个等待事件影响到数据库性能,那么就需要修改应用程序的提交频率 db file sequential read: 在单个数据块上大量等待,该值过高通常是由于表间连接顺序很糟糕,或者使用非选择性的索引 DB_CACHE_SIZE: 可以决定该事件出现的频率 db file scattered read : 意味着等待于全表扫描有关系,通常全表扫描表数据放入内存中,但是被申请到的内存高速缓冲的每个区可能不连续,该值过大说明缺少索引或者限制了索引的使用(也可以调整optimizer_index_cost_adj) ,如果经常必须进行全表扫描,而且表比较小, 把该表存人keep池.如果是大表经常进行全表扫描,那么应该是olap系统,而不是oltp的 buffer busy wait: 当缓冲区以一种非共享方式或者如正在被读入到缓冲时,就会出现该等待.该值不应该大于1%,确认是不是由于热点块造成(如果是可以用反转索引,或者用更小块大小) latch free: 常跟应用没有很好的应用绑定有关 Enqueue : 最有可能是多个用户同时修改同一个块,如果没有空闲的ITL空间,就会出现数据库块级锁 logfile switch: 通常是因为归档速度不够快,需要增大重做日志 log buffer space: 日志缓冲区写的速度快于LGWR写REDOFILE的速度,可以增大日志文件大小 TOP SQL 调整首要的25个缓冲区读操作和首要的25个磁盘读操作做的查询,将可对系统性能产生5%到5000%的增益. Instance Activity Stats for DB: CRMTEMP Instance: crmtemp Snaps: 3 -11 Statistic Total per Second per Trans --------------------------------- ------------------ -------------- ------------ CPU used by this session 291,318 98.1 13.0 CPU used when call started 291,318 98.1 13.0 CR blocks created 1,784 0.6 0.1 Cached Commit SCN referenced 0 0.0 0.0 Commit SCN cached 0 0.0 0.0 DBWR buffers scanned 985,112 331.6 44.0 DBWR checkpoint buffers written 948 0.3 0.0 DBWR checkpoints 0 0.0 0.0 dirty buffers inspected 483 0.2 0.0 --脏缓冲的个数 free buffer inspected 8,154 2.7 0.4 --如果数量很大,说明缓冲区过小 sorts (disk) 0 0.0 0.0 --不应当大于1-5% sorts (memory) 15,365 5.2 0.7 sorts (rows) 1,445,018 823.0 109.2 summed dirty queue length 24,667 8.3 1.1 ...... ...... 大家来补充,最好结合实例进行分析 |
Statspack之十一-Statspack报告各部分简要说明
数据库概要信息
DB Name DB Id Instance Inst Num Release Cluster Host ---------- ----------- ------------ -------- ----------- ------------ GLOB 188430914 glob 1 9.2.0.4.0 NO b02
|
数据库采样时段,这一部分记录了数据库采样的时间,以及采样点数,这部分信息对于report来说是十分重要。
任何统计数据都需要通过时间纬度来衡量,离开了时间,任何数据都失去了意义。
我们在论坛上经常看到有人贴出Top 5等待事件寻求分析,我们的回答是:
无法分析,如果没有时间纬度!
Snap Id Snap Time Sessions Curs/Sess Comment
------- ------------------ -------- --------- -------------------
Begin Snap: 508 10-Nov-03 15:27:29 76 39.4
End Snap: 511 10-Nov-03 15:57:42 66 35.4
Elapsed: 30.22 (mins)
|
主要性能指标说明:
Instance Efficiency Percentages (Target 100%)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Buffer Nowait %: 100.00 Redo NoWait %: 100.00
Buffer Hit %: 99.81 In-memory Sort %: 100.00
Library Hit %: 98.75 Soft Parse %: 97.05
Execute to Parse %: 44.21 Latch Hit %: 94.79
Parse CPU to Parse Elapsd %: 11.74 % Non-Parse CPU: 96.08
|
执行分析比率计算公式如下:
100 * (1 - Parses/Executions) = Execute to Parse
|
所以如果系统Parses > Executions,就可能出现该比率小于0的情况.
该参数计算来自以下部分:
Instance Activity Stats for DB: ORA9 Instance: ora91 Snaps: 30 -32 Statistic Total per Second per Trans --------------------------------- ------------------ -------------- ------------ exchange deadlocks 481 0.2 0.0 execute count 4,873,158 1,968.2 94.4 …………… parse count (failures) 542 0.2 0.0 parse count (hard) 80,281 32.4 1.6 parse count (total) 2,718,643 1,098.0 52.6 parse time cpu 44,009 17.8 0.9 parse time elapsed 374,902 151.4 7.3 ……………………. |
通过公式及以上两个数值:
100 * (1 - Parses/Executions) = Execute to Parse
100 * (1 - 2,718,643/4,873,158) = 0.44211884777797067117462 * 100 = 44.21 |
该值<0通常说明shared pool设置或效率存在问题
造成反复解析,reparse可能较严重,或者可是同snapshot有关
如果该值为负值或者极低,通常说明数据库性能存在问题
来自parse time cpu和parse time elapsed
100*(parse time cpu / parse time elapsed)= Parse CPU to Parse Elapsd % 100*(44,009 / 374,902)= 11.7388010733471680599196590% = 11.74%
|
% Blocks changed per Read: 0.37 Recursive Call %: 1.14 Rollback per transaction %: 38.22 Rows per Sort: 11.83 如果回滚率过高,可能说明你的数据库经历了太多的无效操作 过多的回滚可能还会带来Undo Block的竞争 该参数计算公式如下: |
这一部分的内容还没有写完,在继续进行中...
:)
2004年6月25日 星期五
If you have any question,please mail to eygle@itpub.net .
eygle (eygle@itpub.net)
在数据库管理中,Oracle提供的statspack是一个很强大的工具,通过Statspack,可以收集系统信息,诊断数据库故障,也方便第三方技术支持进行远程阅读和建议。
看到很多人还不太了解这个工具的使用,论坛上同样的问题很多,所以写了一下一个说明文档,主要涉及安装配置和数据收集。
希望通过这些文字可以使不了解的朋友学会怎样配置和使用Statspack!
下面是正文:
Oracle Statspack 从Oracle8.1.6开始被引入Oracle,并马上成为DBA和Oracle专家用来诊断数据库性能的强有力的工具。通过Statspack我们可以很容易的确定Oracle数据库的瓶颈所在,记录数据库性能状态。因此了解和使用Statspack对于DBA来说至关重要。 在数据库中Statspack的脚本位于$Oracle_HOME/RDBMS/ADMIN目录下,对于Oracle8.1.6,是一组以stat开头的文件;对于Oracle8.1.7,是一组以sp开头的文件。 在Oracle8.1.6中,Statspack第一次发布,但是你也可以在以下链接找到可用于Oracle80~Oracle8.1.5的版本。
http://www.Oracle.com/oramag/Oracle/00-Mar/index.html?o20tun.html http://www.Oracle.com/oramag/Oracle/00-Mar/index.html?statspack-other.html
在816以前的版本使用Statspack,你需要使用statscbps.sql脚本建立一个v$buffer_pool_statistics视图,该脚本包含在以上链接下载的tar文件中。 访问该链接,你可能需要一个OTN帐号,申请该帐号是免费的。
在Statspack发布之前,我们通常能够使用诊断数据库的工具是两个脚本UTLBSTAT.SQL和UTLESTAT.SQL,BSTAT/ESTAT是一个非常简单的性能诊断工具。UTLBSTAT获得开始时很多V$视图的快照,UTLESTAT通过先前的快照和当前视图生成一个报表。实际上通过这个报表我们很难读出或者解释系统性能方面的问题。Statspack改变了这一切,通过连续的数据收集,Statspack能给我们提供至关重要的趋势分析。这是一个巨大的进步。
下面我们来讲一讲Statspack的安装,配置,使用,解读。
一. 系统参数
为了能够顺利安装和运行Statspack你可能需要设置以下系统参数:
1. job_queue_processes 为了能够建立自动任务,执行数据收集,该参数需要大于0。你可以在初试化参数文件中修改该参数。
2. timed_statistics 收集操作系统的计时信息,这些信息可被用来显示时间等统计信息、优化数据库和 SQL 语句。要防止因从操作系统请求时间而引起的开销,请将该值设置为False。 使用statspack收集统计信息时建议将该值设置为 TRUE,否则收集的统计信息大约只能起到10%的作用,将timed_statistics设置为True所带来的性能影响与好处相比是微不足道的。 该参数使收集的时间信息存储在在V$SESSTATS 和V$SYSSTATS 动态性能视图中。
Timed_statistics参数可以在实例级进行更改
SQL> alter system set timed_statistics = true;
System altered
SQL>
二. 安装Statspack
安装Statspack需要用internal身份登陆,或者拥有SYSDBA(connect / as sysdba)权限的用户登陆。需要在本地安装或者通过telnet登陆到服务器。 在Oracle8.1.6版本中运行statscre.sql;在Oracle8.1.7版本中运行spcreate.sql。
首先登陆到数据库,最好转到$Oracle_HOME/RDBMS/ADMIN目录,这样我们执行脚本就可以方便些。
D:>cd Oracleora81rdbmsadmin
D:Oracleora81RDBMSADMIN>sqlplus internal
SQL*Plus: Release 8.1.7.0.0 - Production on 星期二 12月 3 16:54:53 2002
(c) Copyright 2000 Oracle Corporation. All rights reserved.
请输入口令:
连接到:
Oracle8i Enterprise Edition Release 8.1.7.0.0 - Production
With the Partitioning option
JServer Release 8.1.7.0.0 - Production
SQL> SELECT instance_name, host_name, VERSION, startup_time FROM v$instance;
INSTANCE_NAME HOST_NAME VERSION STARTUP_TI
-------------- ---------- --------- ------------
eygle AM-SERVER 8.1.7.0.0 22-11月-02
SQL>
检查数据文件路径及磁盘空间,以决定创建数据文件的位置:
SQL> SELECT file_name FROM dba_data_files;
FILE_NAME
---------------------------------------------------------------------D:OracleORADATAEYGLESYSTEM01.DBF
D:OracleORADATAEYGLERBS01.DBF
D:OracleORADATAEYGLEUSERS01.DBF
D:OracleORADATAEYGLETEMP01.DBF
D:OracleORADATAEYGLETOOLS01.DBF
D:OracleORADATAEYGLEINDX01.DBF
D:OracleORADATAEYGLEDR01.DBF
D:OracleORADATAEYGLEGGQIANG01.DBF
D:OracleORADATAEYGLEEQSP01.DBF
D:OracleORA81DATABASEMP5_DATA.DBF
D:OracleORA81DATABASEMP5_INDX.DBF
D:OracleORA81DATABASEMP5_TEMP.DBF
D:OracleORA81DATABASEMP5_IDNX.DBF
D:OracleORADATAEYGLEHRM01.DBF
D:OracleORADATAEYGLETIB.DBF
D:OracleORADATAEYGLEEQSP02.DBF
D:OracleORADATAEYGLERMAN_TS.DBF
D:OracleORADATAEYGLEEQSP03.DBF
D:OracleORADATAEYGLEEAPP01.DBF
D:OracleORADATAEYGLEEQSP04.DBF
D:OracleORADATAEYGLEAM01.DBF
D:OracleORADATAEYGLESYSTEM02.DBF
D:OracleORADATAEYGLEFNC01.DBF
D:OracleORADATAEYGLEHH_AM01.ORA
已选择24行。
SQL>
创建存储数据的表空间,如果采样间隔较短,周期较长,打算长期使用,那么你可能需要一个大一点的表空间,如果每个半个小时采样一次,连续采样一周,数据量是很大的。本例创建一个500M的测试表空间。
SQL> CREATE tablespace perfstat
2 datafile 'd:Oracleoradataeygleperfstat.dbf'
3 size 500M;
表空间已创建。
SQL>
检查是否存在安装所需要的脚本文件
SQL> host dir sp* 驱动器 D 中的卷没有标签。 卷的序列号是 5070-5982
D:Oracleora81RDBMSADMIN 的目录
2000-02-18 14:34 1,841 spauto.sql
2000-06-15 15:21 64,492 spcpkg.sql
2000-02-18 14:34 916 spcreate.sql
2000-06-15 15:21 31,985 spctab.sql
2000-06-15 15:21 6,623 spcusr.sql
2000-06-15 15:53 47,820 spdoc.txt
2000-06-15 15:22 794 spdrop.sql
2000-06-15 15:21 3,732 spdtab.sql
2000-06-15 15:21 1,334 spdusr.sql
2000-06-15 15:22 7,002 sppurge.sql
2000-07-12 15:07 72,992 spreport.sql
2000-06-15 15:22 2,278 sptrunc.sql
2000-02-18 14:34 612 spuexp.par
2000-06-15 15:22 31,122 spup816.sql
14 个文件 273,543 字节
0 个目录 3,974,799,360 可用字节
接下来我们就可以开始安装Statspack了。这期间会提示你输入缺省表空间和临时表空间的位置,输入我们为perfstat用户创建的表空间和你的临时表空间。
SQL> @spcreate
.
.
.
.
Specify PERFSTAT user's default tablespace 输入 default_tablespace 的值: perfstat
Using perfstat for the default tablespace
用户已更改。
用户已更改。
Specify PERFSTAT user's temporary tablespace 输入 temporary_tablespace 的值: temp
如果安装成功,你可以看到如下的输出信息:
SQL> host type spcpkg.lis
Creating Package STATSPACK...
程序包已创建。
没有错误。
Creating Package Body STATSPACK...
程序包主体已创建。
没有错误。
NOTE:
SPCPKG complete. Please check spcpkg.lis for any errors.
你可以查看.lis文件查看安装时的错误信息。
SQL> host dir *.lis 驱动器 D 中的卷没有标签。 卷的序列号是 5070-5982
D:Oracleora81RDBMSADMIN 的目录
2002-12-03 17:25 204 spcpkg.lis
2002-12-03 17:25 2,276 spctab.lis
2002-12-03 17:25 3,965 spcusr.lis
2002-12-03 17:23 1,187 spdtab.lis
2002-12-03 17:24 351 spdusr.lis
5 个文件 7,983 字节
0 个目录 3,965,304,832 可用字节
SQL> host find “ORA-“ *.lis
SQL> host find "err" *.lis
---------- SPAUTO.LIS
---------- SPCPKG.LIS
SPCPKG complete. Please check spcpkg.lis for any errors.
---------- SPCTAB.LIS
SPCTAB complete. Please check spctab.lis for any errors.
---------- SPCUSR.LIS
SPCUSR complete. Please check spcusr.lis for any errors.
---------- SPDTAB.LIS
在UNIX上,你可以通过以下命令查看相应的错误信息
$ ls *.lis
spauto.lis spcpkg.lis spctab.lis spcusr.lis spdtab.lis spdusr.lis
$ grep ORA- *.lis
$ grep err *.lis
spcpkg.lis:SPCPKG complete. Please check spcpkg.lis for any errors.
spctab.lis:SPCTAB complete. Please check spctab.lis for any errors.
spcusr.lis:SPCUSR complete. Please check spcusr.lis for any errors.
spdtab.lis:SPDTAB complete. Please check spdtab.lis for any errors.
spdusr.lis:SPDUSR complete. Please check spdusr.lis for any errors.
在这一步,如果出现错误,那么你可以运行spdrop.sql脚本来删除这些对象。然后重新运行spcreate.sql来创建这些对象。运行 SQL*Plus, 以具有SYSDBA 权限的用户登陆:
SQL> @spdrop.sql
.
.
. 同义词已丢弃。off;
视图已丢掉。
同义词已丢弃。
视图已丢掉。
同义词已丢弃。
用户已丢弃
NOTE:
SPDUSR complete. Please check spdusr.lis for any errors.
SQL>
三. 测试安装好的Statspack 运行statspack.snap可以产生系统快照,运行两次,然后执行spreport.sql就可以生成一个基于两个时间点的报告。
如果一切正常,说明安装成功。
SQL>execute statspack.snap
PL/SQL procedure successfully completed.
SQL>execute statspack.snap
PL/SQL procedure successfully completed.
SQL>@spreport.sql
…
可是有可能你会得到以下错误:
SQL> exec statspack.snap;
BEGIN statspack.snap; END;
*
ERROR at line 1:
ORA-01401: inserted value too large for column
ORA-06512: at "PERFSTAT.STATSPACK", line 978
ORA-06512: at "PERFSTAT.STATSPACK", line 1612
ORA-06512: at "PERFSTAT.STATSPACK", line 71
ORA-06512: at line 1
这是Oracle的一个Bug,Bug号1940915。 该Bug自8.1.7.3后修正。 这个问题只会出现在多位的字符集,需要修改spcpkg.sql脚本,$Oracle_HOME/rdbms/admin/spcpkg.sql,将"substr" 修改为 "substrb",然后重新运行该脚本。 该脚本错误部分:
select l_snap_id
, p_dbid
, p_instance_number
, substr(sql_text,1,31) ...........
substr 会将多位的字符, 当作一个byte.substrb 则会当作多个byte。在收集数据时, statpack 会将 top 10 的 sql 前 31 个字节 存入数据表中,若在SQL的前31 个字有中文,就会出现此错误。
四. 规划自动任务
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 每五分钟一次
我们可以修改spauto.sql来更改执行间隔,如:
dbms_job.submit(:jobno, 'statspack.snap;', trunc(sysdate+1/144,'MI'), 'trunc(SYSDATE+1/24,''HH'')', TRUE, :instno);
然后我们执行spauto,这样我们就建立了一个每30分钟执行一次的数据收集计划。你可以查看spauto.lis来获得输出信息:
SQL>
SQL> --
SQL> -- Schedule a snapshot to be run on this instance every hour, on the hour
SQL>
SQL> variable jobno number;
SQL> variable instno number;
SQL> begin
2 select instance_number into :instno from v$instance;
3 dbms_job.submit(:jobno, 'statspack.snap;', trunc(sysdate+1/144,'MI'), 'trunc(SYSDATE+1/144,''MI'')', TRUE, :instno);
4 commit;
5 end;
6 /
PL/SQL 过程已成功完成。
SQL>
Job number for automated statistics collection for this instance
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Note that this job number is needed when modifying or removing
the job:
JOBNO
----------
22
Job queue process
~~~~~~~~~~~~~~~~~
Below is the current setting of the job_queue_processes init.ora
parameter - the value for this parameter must be greater
than 0 to use automatic statistics gathering:
SQL> show parameter job_queue_processes
NAME TYPE VALUE
------------------------------------ ------- ------------------------------
job_queue_processes integer 12
Next scheduled run
~~~~~~~~~~~~~~~~~~
The next scheduled run for this job is:
SQL> select job, next_date, next_sec
2 from user_jobs
3 where job = :jobno;
JOB NEXT_DATE NEXT_SEC
---------- ---------- ----------------
22 04-12月-02 15:00:00
SQL>
五. 生成分析报告 调用spreport.sql可以生成分析报告:
SQL> @spreport
DB Id DB Name Inst Num Instance
----------- ------------ -------- ------------
1277924236 EYGLE 1 eygle
Completed Snapshots
Snap Snap
Instance DB Name Id Snap Started Level Comment
------------ ------------ ----- ----------------- ----- ----------------------
eygle EYGLE 1 04 12月 2002 14:4 5
8
2 04 12月 2002 15:0 5
0
3 04 12月 2002 15:1 5
0
4 04 12月 2002 15:2 5
0
………………..
87 05 12月 2002 02:2 5
3
88 05 12月 2002 02:3 5
3
89 05 12月 2002 02:4 5
3
90 05 12月 2002 02:5 5
3
91 05 12月 2002 03:0 5
3
92 05 12月 2002 03:1 5
3
93 05 12月 2002 03:2 5
3
94 05 12月 2002 03:3 5
3
95 05 12月 2002 03:4 5
3
96 05 12月 2002 03:5 5
3
97 05 12月 2002 04:0 5
3
98 05 12月 2002 04:1 5
3
eygle EYGLE 99 05 12月 2002 04:2 5
3
100 05 12月 2002 04:3 5
3
Specify the Begin and End Snapshot Ids
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 输入 begin_snap 的值: 1
Begin Snapshot Id specified: 1
输入 end_snap 的值: 100
End Snapshot Id specified: 100
Specify the Report Name
~~~~~~~~~~~~~~~~~~~~~~~
The default report file name is sp_1_100. To use this name,
press <return> to continue, otherwise enter an alternative. 输入 report_name 的值: rep1205.txt
Using the report name rep1205.txt
这样就生成了一个报告,可是如果中间停过机,那么你可能收到以下错误信息:
ERROR: Snapshots chosen span an instance shutdown: RESULTS ARE INVALID
STATSPACK report for
DB Name DB Id Instance Inst Num Release OPS Host
------------ ----------- ------------ -------- ----------- --- ------------
EYGLE 1277924236 eygle 1 8.1.7.0.0 NO AM-SERVER
:ela := ;
*
ERROR 位于第 4 行:
ORA-06550: 第 4 行, 第 17 列:
PLS-00103: 出现符号 ";"在需要下列之一时:
(-+modnotnull<an identifier>
<a double-quoted delimited-identifier><a bind variable>avg
countcurrentexistsmaxminpriorsqlstddevsumvarianceexecute
foralltimetimestampintervaldate
<a string literal with character set specification>
<a number><a single-quoted SQL string> 符号 "null" 被替换为 ";" 后继续。
ORA-06550: 第 6 行, 第 16 列:
PLS-00103: 出现符号 ";"在需要下列之一时:
(-+modnotnull<an identifier>
<a double-quoted delimited-identifier><a bind variable>avg
countcurrentexistsmaxminpriorsqlstddevsumvarianceexecute
foralltimetimestampintervaldate
<a stri
六. 移除定时任务
移除一个定时任务,可以如下操作:
SQL> select job,log_user,priv_user,last_date,next_date,interval from user_jobs;
JOB LOG_USER LAST_DATE NEXT_DATE INTERVAL
---------- ------------------------------ ------------------------------ ------------------------------ ----------- 22 PERFSTAT 2002-12-5:14:33:26 2002-12-5 14:43:00 trunc(SYSDATE+1/144,'MI')
SQL> execute dbms_job.remove('22')
PL/SQL procedure successfully completed
七. 删除历史数据
删除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的范围以保留你需要的数据。 在以上删除过程中,你可以看到所有相关的表都被锁定。
SQL> select a.object_id,a.Oracle_username ,b.object_name
from v$locked_object a,dba_objects b
where a.object_id = b.object_id
/
OBJECT_ID Oracle_USERNAME OBJECT_NAME
------------------------------------- ---------------------------------------------------------------------156 PERFSTAT SNAP$
39700 PERFSTAT STATS$LIBRARYCACHE
39706 PERFSTAT STATS$ROLLSTAT
39712 PERFSTAT STATS$SGA
39754 PERFSTAT STATS$PARAMETER
39745 PERFSTAT STATS$SQL_STATISTICS
39739 PERFSTAT STATS$SQL_SUMMARY
39736 PERFSTAT STATS$ENQUEUESTAT
39733 PERFSTAT STATS$WAITSTAT
39730 PERFSTAT STATS$BG_EVENT_SUMMARY
39724 PERFSTAT STATS$SYSTEM_EVENT
39718 PERFSTAT STATS$SYSSTAT
39715 PERFSTAT STATS$SGASTAT
39709 PERFSTAT STATS$ROWCACHE_SUMMARY
39703 PERFSTAT STATS$BUFFER_POOL_STATISTICS
39697 PERFSTAT STATS$LATCH_MISSES_SUMMARY
39679 PERFSTAT STATS$SNAPSHOT
39682 PERFSTAT STATS$FILESTATXS
39688 PERFSTAT STATS$LATCH
174 PERFSTAT JOB$
20 rows selected
八. 调整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;
一一. 在815上的安装配置 a. 数据库状况
SQL> select * from v$version;
BANNER
----------------------------------------------------------------
Oracle8i Enterprise Edition Release 8.1.5.0.0, 64 bit - Producti
PL/SQL Release 8.1.5.0.0 - Production
CORE Version 8.1.3.0.0 - Production
TNS for HPUX: Version 8.1.5.0.0 - Production
NLSRTL Version 3.4.0.0.0 - Production
b. 运行statscbps.sql
SQL> @statscbps.sql
View created.
Synonym created.
Grant succeeded.
SQL>
其他步骤都是相同的。
End![]()
statspack报告数据结果解释
本人将最近在学习性能调优时,所用笔记总结如下,欢迎批评指正
本文将不断更新,欢迎补充。(所列数据仅用于便于说明,没有实
际意义)
一、statspack 输出结果中必须查看的十项内容
1、负载间档(Load profile)
2、实例效率点击率(Instance efficiency hit ratios)
3、首要的5个等待事件(Top 5 wait events)
4、等待事件(Wait events)
5、闩锁等待
6、首要的SQL(Top sql)
7、实例活动(Instance activity)
8、文件I/O(File I/O)
9、内存分配(Memory allocation)
10、缓冲区等待(Buffer waits)
二、输出结果解释
1、报表头信息
数据库实例相关信息,包括数据库名称、ID、版本号及主机等信息
| Quote: | |
|
| Quote: | |
|
| Quote: | |
|
| Quote: | |
|
| Quote: | |
|








