ITPub博客

首页 > Linux操作系统 > Linux操作系统 > Oracle优化(3)

Oracle优化(3)

原创 Linux操作系统 作者:tangtao94 时间:2010-07-08 13:07:31 0 删除 编辑

三、确定当前Oracle性能瓶颈
(1)V$SYSTEM_EVENT、V$SESSION_EVENT、V$SESSION_WAIT三个动态性能视图称之为等待接口。
(2)等待事件,分为空闲等待事件和非空闲等待事件。
 1)空闲等待事件指Oracle正在等待某项操作;
 2)非空闲等待事件专门指Oracle活动,例如
  db file scattered read (DB文件分散读取)
  这种情况通常与全表扫描相关. 当数据库进行全表扫描时, 基于性能的考虑, 数据会分散(scattered)读入buffer cache. 如果这个等待事件比较显着, 可能考虑查看对应的表有没有创建合适的索引.
  然而这个等待事件并不一定就意味着性能低下, 在某些条件下oracle会主动使用全表扫描来替换索引扫描以提高性能, 这和访问的数据量有关, 在CBO下oracle会进行更为智能的选择, RBO下oracle更倾向于使用索引.
  因为全表扫描到内存的数据块被置于LRU链表的冷端, 所以这些数据块将可能在较短时间内被置换出物理内存, 为了避免反复物理IO, 对频繁访问的较小的数据表,可以选择把他们cache到内存中.
  当这个等待时间比较显着时, 可以结合v$session_longops动态性能视图来进行诊断, 该视图中记录了长时间(运行时间超过6秒)运行的事务, 可能很多是全表扫描操作.
  db file sequential read(DB 文件顺序读取)
  这一事件通常显示与单个数据块相关的读取操作, 比如对索引块的读取. 如果这个等待事件比较显着, 可能表示在多表连接中, 表的链接顺序存在问题, 可能没有正确的使用驱动表; 或者可能说明不加选择地进行索引.
  free buffer (释放缓冲区)
  这个等待事件表明系统正在等待内存中的可用空间,这说明当前Buffer 中已经没有Free 的内存空间。Free Buffer 等待可能说明DBWR 的写出速度不够,或者磁盘存在严重的竞争,可以需要考虑增加检查点、使用更多的DBWR 进程,或者增加物理磁盘的数量,分散负载,平衡IO。
  buffer busy(缓冲区忙)
  该等待事件表示正在等待一个以unshareable方式使用的缓冲区,或者表示当前正在被读入buffer cache。一般来说Buffer Busy Wait不应大于1%。检查缓冲等待统计部分(或V$WAITSTAT),看一下等待是否位于段头(Segment Header)。如果是,可以考虑增加自由列表(freelist,对于Oracle8i DMT)或者增加freelist groups(在很多时候这个调整是立竿见影的,在8.1.6之前,这个freelists参数不能动态修改;在8.1.6及以后版本,动态修改 feelists需要设置COMPATIBLE至少为8.1.6).
  latch free (latch 释放)
  latch是一种低级排队机制,用于保护SGA中共享内存结构。latch就像是一种快速地被获取和释放的内存锁。用于防止共享内存结构被多个用户同时访问。如果latch不可用,就会记录latch释放失败(latch free miss )。有两种与闩有关的类型:
  ■ 立刻
  ■ 可以等待
  假如一个进程试图在立刻模式下获得闩,而该闩已经被另外一个进程所持有,如果该闩不能立可用的话,那么该进程就不会为获得该闩而等待。它将继续执行另一个操作。
  大多数latch问题都与以下操作相关:
  没有很好的是用绑定变量(library cache latch)、重作生成问题(redo allocation latch)、缓冲存储竞争问题(cache buffers LRU chain),以及buffer cache中的存在"热点"块(cache buffers chain)。
  通常我们说,如果想设计一个失败的系统,不考虑绑定变量,这一个条件就够了,对于异构性强的系统,不使用绑定变量的后果是极其严重的。
  另外也有一些latch等待与bug有关,应当关注Metalink相关bug的公布及补丁的发布。当latch miss ratios大于0.5%时,就应当研究这一问题。
  log buffer space(日志缓冲空间)
  当你将日志缓冲(log buffer)产生重做日志的速度比LGWR 的写出速度快,或者是当日志切换(log switch)太慢时,就会发生这种等待。这个等待出现时,通常表明redo log buffer 过小,为解决这个问题,可以考虑增大日志文件的大小,或者增加日志缓冲器的大小。
  另外一个可能的原因是磁盘I/O 存在瓶颈,可以考虑使用写入速度更快的磁盘。在允许的条件下设置可以考虑使用裸设备来存放日志文件,提高写入效率。在一般的系统中,最低的标准是,不要把日志文件和数据文件存放在一起,因为通常日志文件只写不读,分离存放可以获得性能提升
(3)V$SYSTEM_EVENT反映的一些信息,存放实例启动以来的所有等待事件
   V$SYSTEM_EVENT中的常用列
   l--------->EVENT:等待事件名称
   l--------->TOTAL_WAITS:此项事件总等待次数
   l--------->TIME_WAITED:此项事件的总等待时间(单位:百分之一秒)
   l--------->AVERAGE_WAIT:此项事件的平均等待用时(单位:百分之一秒)(time_waited/total_waits)
   l--------->TOTAL_TIMEOUTS:此项事情总等待超时次数
(4)V$SESSION_EVENT
   l--------->SID:session标识
   l--------->EVENT:session等待的事件
   l--------->TOTAL_WAITS:此session当前事件的总等待数
   l--------->TIME_WAITED:此session总等待时间(单位,百分之一秒)
   l--------->AVERAGE_WAIT:此session当前事件平均等待时间(单位,百分之一秒)
   l--------->TOTAL_TIMEOUTS:等待超时次数
   l--------->其它用法与V$SESSION_WAIT相似,不详述了
(5)V$SESSION_WAIT   
  $SESSION_WAIT中,每一个连接到实例的session都对应一条记录。

  V$SESSION_WAIT中的常用列
   l--------->SID: session标识
   l--------->EVENT: session当前等待的事件,或者最后一次等待事件。
   l--------->WAIT_TIME: session等待事件的时间(单位,百分之一秒)如果本列为0,说明session当前session还未有任何等待。
   l--------->SEQ#: session等待事件将触发其值自增长
   l--------->P1, P2, P3: 等待事件中等待的详细资料
   l--------->P1TEXT, P2TEXT, P3TEXT: 解释说明p1,p2,p3事件
   l--------->State事件状态,提供了WAIT_TIME和SECOND_IN_WAIT的详细细节。
              WAITING会话正在等待此事件
              WAITED UNKNOWNED TIME如果TIME_STATICTICS为假,此状态为真
              Wait short time:表示发生了等待,但由于时间非常短不超过一个时间单位,所以没有记录。
         Waited knnow time:如果session等待然后得到了所需资源,那么将从waiting进入本状态。

         Wait_time值也有四种含义:
         值>0:最后一次等待时间(单位:10ms),当前未在等待状态。
         值=0:session正在等待当前的事件。
         值=-1:最后一次等待时间小于1个统计单位,当前未在等待状态。
         值=-2:时间统计状态未置为可用,当前未在等待状态。
        
         Wait_time和Second_in_wait字段值与state相关:
         如果state值为Waiting,那么wait_time值无用。Second_in_wait值是实际的等待时间(单位:秒)。
         如果state值为Wait unknow time,那么wait_time值和Second_in_wait值都无用。
         如果state值为Wait short time,那么wait_time值和Second_in_wait值都无用。
         如果state值为Waiting known time,那么wait_time值就是实际等待时间(单位:秒),Second_in_wait值无用。

基于等待事件的性能优化方法        
查询常见等待事件
Select *
  from v$session
 where event in ('buffer busy waits', 'db file sequential read',
        'db file scattered read', 'enquenue', 'free buffer waits',
        'latch free', 'log file paralles write', 'log file sync');

利用v$session、v$session_event来查询对上面得到的结果有贡献的等待事件的会话。
select se.SID,
       s.USERNAME,
       se.EVENT,
       se.TOTAL_WAITS,
       se.TIME_WAITED,
       se.AVERAGE_WAIT
  from v$session s, v$session_event se
 where s.USERNAME is not null
   and s.SID = se.SID
   and s.STATUS = 'ACTIVE'
   and se.EVENT not like '%SQL*NET%';

找到与当前会话相关的当前等待事件
select sw.SID,
       s.USERNAME,
       sw.EVENT,
       sw.STATE,
       sw.WAIT_TIME,
       sw.SECONDS_IN_WAIT SEC_IN_WAIT
  from v$session s, v$session_wait sw
 where s.USERNAME is not null
   and s.SID = sw.SID
   and s.STATUS = 'ACTIVE'
   and sw.EVENT not like '%SQL*NET%';
然后根据查询到的SID来从v$session_wait查找所关心的事件
select * from v$session_wait where SID='XXX';

利用上面查询出来的关心的信息进行如下操作
Select Owner, Segment_Name, Segment_Type, Tablespace_Name
  from DBA_EXTENTS
 where file_id = &fileld_in
   and &blockid_in between block_id and block_id * blocks - 1;
从V$SQLTEXT中检索出会话的SQL文本的小函数

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/518171/viewspace-667572/ ,如需转载,请注明出处,否则将追究法律责任。

上一篇: Oracle优化(2)
下一篇: Oracle优化(4)
请登录后发表评论 登录
全部评论

注册时间:2010-07-06

  • 博文量
    33
  • 访问量
    242821