技术头条 - 一个快速在微博传播文章的方式     搜索本站
您现在的位置首页 --> 算法 --> 关于Freelists和Freelist Groups的研究

关于Freelists和Freelist Groups的研究

浏览:903次  出处信息
样的总时间不能过长,因为这个SQL对于系统还是有影响的。

 

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的类型和模式,p2p3根据p1的不同有不同的含义。

 

注意:在Oracle10g之前,由于各种enqueue类型都显示为同样的enqueue等待,所以p2p3的含义并不能从公开的文档中获得,而在10g中各种enqueue都显示为单独的enqueue等待,所以我们可以从V$EVENT_NAME视图的PARAMETER2PARAMETER3字段中轻松获得每种不同enequep2p3含义。

 

p1的返回值是10进制,转化为16进制以后,低2位表示模式,高2位表示类型。

 

现在我们假设p1= 1213661190,看一下如何通过这个数字得到enqueue的信息。

10进制:1213661190

转化为16进制:4857 0006

2位:0006 => 模式(mode)是6,表示为Exclusive

2位:4857 => 4857分成两个单字节,分别是4857

4857转化为10进制:7287

ASCII72的字符:H

ASCII87的字符: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)
QQ技术交流群:445447336,欢迎加入!
扫一扫订阅我的微信号:IT技术博客大学习
© 2009 - 2024 by blogread.cn 微博:@IT技术博客大学习

京ICP备15002552号-1