关于Freelists和Freelist Groups的研究
SELECT /*+rule*/s.username, e.owner, e.segment_name, p1 "File#", p2 "Block#"
FROM v$session s, v$session_wait w, dba_extents e
WHERE w.event='buffer busy waits'
AND s.sid = w.sid
AND e.file_id = p1
AND p2 between e.block_id and e.block_id +(e.blocks - 1);
返回的结果中username表示读取这个块的用户名,owner表示拥有热点块所属segment的用户名,segment_name表示热点块所属的segment名称,File#表示热点块所处的数据文件号,Block#表示热点块号。
注意:如果我们使用Oracle10g,那么新增的性能视图-V$SESSION_WAIT_HISTORY将自动保留最近的10个会话等待事件的历史信息,通过这个视图可以更简单地判断问题。
如果我们设置了多个freelist group,那么我们在V$WAITSTAT视图中还可能会发现free list类别的等待,这个等待表示在freelist group blocks上产生了争用。注意,只有当设置了多个freelist groups时,才可能出现这个类别的buffer busy waits等待事件。至于调优的方法可以参看上面的调整手段。
2. Enqueue
enqueue也是一种锁(lock),只不过是oracle用来管理共享内存结构的锁定机制,通过enqueue来保证对于数据库资源的串行存取。
当我们在V$SYSTEM_EVENT中或者statspack报告中发现了严重的enqueue等待,首先需要确定的是系统在经历什么类型的enqueue等待。
如果我们使用了statspack,那么可以查看报告相应部分的enqueue等待详细信息。
或者也可以通过以下方法来确定enqueue类型。
运行下面的SQL,得到enqueue等待的相应记录。
SELECT username, event, p1, p2, p3
FROM v$session s, v$session_wait w
WHERE event='enqueue'
AND s.sid = w.sid;
返回结果中p1表示enqueue的类型和模式,p2和p3根据p1的不同有不同的含义。
注意:在Oracle10g之前,由于各种enqueue类型都显示为同样的enqueue等待,所以p2和p3的含义并不能从公开的文档中获得,而在10g中各种enqueue都显示为单独的enqueue等待,所以我们可以从V$EVENT_NAME视图的PARAMETER2和PARAMETER3字段中轻松获得每种不同eneque的p2和p3含义。
p1的返回值是10进制,转化为16进制以后,低2位表示模式,高2位表示类型。
现在我们假设p1= 1213661190,看一下如何通过这个数字得到enqueue的信息。
10进制:1213661190
转化为16进制:4857 0006
低2位:0006 => 模式(mode)是6,表示为Exclusive。
高2位:4857 => 将4857分成两个单字节,分别是48和57
将48和57转化为10进制:72和87
ASCII为72的字符:H
ASCII为87的字符:W
SQL> select chr(72)||chr(87) "enqueue" from dual;
enqueue
-------
HW
由此我们知道了现在经历的是HW enqueue等待,并且是独占模式(mode = Exclusive)。
我们也可以简单地使用下面的SQL直接获得enqueue的类型和模式。
select sid,
event,
p1,
p1raw,
chr(bitand(P1, -16777216) / 16777215) ||
chr(bitand(P1, 16711680) / 65535) "TYPE",
mod(P1, 16) "MODE"
from v$session_wait
where event = 'enqueue';
跟freelists争用相关的enqueue等待常见的是HW。
当给segment分配新的extent时,将放置HW enqueue,如果有多个进程同时请求insert数据并且需要分配新的extent提升HWM的时候就会产生HW enqueue争用。通常发生在设置了多个的free list group的情况下。
如果为了避免freelists争用,而增加freelist group,确实可以减少Buffer Busy Waits事件,也会减少所有类别的block上的等待(从V$WAITSTAT视图中可以得知),但是却会增加HW Enqueu的等待事件。
因为一个进程使用了一个freelist group之后,即使其它的freelist group中有大量的空闲空间(比如一个进程刚刚删除了大量的数据,从而在自己的TFL上腾出了很多空闲块),这个进程也不会去检索。所以如果这个进程正好需要insert大量数据,那么就很可能会提升HWM,也就会放置HW enqueue,那么如果还有其它的进程也需要insert数据,就不可避免地经历HW enqueue等待。正是由于多个freelist group使提升HWM的几率变大,所以也就会导致HW Enqueue等待事件的增多。本章作者:张乐奕(Kamus)
扫一扫订阅我的微信号:IT技术博客大学习
- 作者:eygle@eygle.com(eygle) 来源: Oracle Life
- 标签: freelists
- 发布时间:2011-12-18 23:22:41
- [66] Go Reflect 性能
- [66] Oracle MTS模式下 进程地址与会话信
- [65] 如何拿下简短的域名
- [59] IOS安全–浅谈关于IOS加固的几种方法
- [59] android 开发入门
- [59] 图书馆的世界纪录
- [58] 【社会化设计】自我(self)部分――欢迎区
- [53] 视觉调整-设计师 vs. 逻辑
- [47] 界面设计速成
- [47] 读书笔记-壹百度:百度十年千倍的29条法则