Chinaunix首页 | 论坛 | 博客
  • 博客访问: 121217
  • 博文数量: 27
  • 博客积分: 1200
  • 博客等级: 中尉
  • 技术积分: 350
  • 用 户 组: 普通用户
  • 注册时间: 2010-12-22 14:56
文章分类

全部博文(27)

文章存档

2011年(19)

2010年(8)

我的朋友

分类: Oracle

2011-03-22 17:03:06

6.2、enq:SQ-contention,DFS lock handle(SV)
     Oracle为了管理sequence使用了以下三中锁
    
     row cache lock
       在调用sequence.nextval过程中,将数据字典信息进行物理修改时获取,赋予了nocache属性的sequence上发生
     SQ锁
        在内存上缓存(cache)范围内,调用sequence.nextval期间拥有此锁,赋予了cache属性的sequence上发生。
     SV锁         
       RAC上节点之间顺序得到保障的情况下,调用sequence.nextval期间获得,赋予了cache+order属性的sequence上发生。
    
     赋予了CACHE属性的sequence调用nextval期间,应该以SSX模式获得SQ锁,许多会话同时为了获取SQ锁而发生争用过程中,若发生争用,则
 等待ENQ:SQ-CONTENTION,enq:SQ-contention事件的P2值是sequence的object ID,因此,若利用P2值与DBA_OBJECTS的结合,就可以知道对哪个、
 Sequence发生了等待对象。
    
     创建Sequence赋予的CACHE值较小时,有enq:SQ-contention等待增加的趋势,CACHE值较小,内存上事先CACHE的值很快被耗尽,这时需要将
 数据字典信息物理修改,再次执行CACHE的工作,在此期间,因为一直要拥有SQ锁,相应的Enq:SQ-contention事件的等待时间也会延长,很不幸的是,在创建
 Sequence时,将CACHE值的缺省值设定为较小的20,因此创建使用量最多的Sequence时,CACHE值应该取1000以上的较大值。
    
     偶而一次性同时创建许多会话,有时会发生enq:SQ-contention等待事件,其理由是V$SESSION.AUDSID(auditing sessionid)列值是利用Sequence
 创建的,oracle在创建新的会话后,利用名为SYS.AUDSESS$的sequence的nextval创建AUDSID的值,SYS.AUDSESS$ Sequence的CACHE大小的缺省值设定为
 20,许多会话同时连接,可以将SYS.AUDSESS$ sequence的CACHE大小扩大至1000,以此可以解决 enq:SQ-contention等待问题。
    
     RAC上创建Sequence时,在赋予了CACHE属性的状态下,若没有赋予ORDER属性,则各节点将会把不同范围的Sequence值CACHE到内存上,比如拥有两个节点
 的RAC环境下,创建CACHE值为100的 sequence时,1节点会使用1-100,2节点会使用101-200,若两个节点之间会通过递增的使用sequence,必须赋予如下ORDER属性。
 
 
     SQL>Create sequence ordered_sequence cache 100 order;
    
     如果已赋予CACHE+ORDER属性的sequence,oracle使用SV锁进行行行同步,即,对赋予了ORDER属性的sequence调用nextval时,应该以SSX模式拥有SV锁,在获取SV锁
 过程中,若发生了争用,不是等待ROW CACHE或者是enq:SQ-contention,而是等待名为DFS lock handle事件,正因如此V$EVENT_NAME视图上不存在类似与"enq:SV-contention"
DFS lock handle事件是在OPS或者RAC环境下,除了高速缓冲区同步之外,还有行高速缓冲区或者库高速缓冲区了同步获取锁的过程中的等待事件。若保证全局范围内获得锁,在此过程
中会发生DFS look handle等待,在获取SV锁的过程中发生的DFS lock handle等待事件的P1,P2值与enq:SQ-contention等待事件相同(p1=mode+namespace,p2=object#).因此会
从P1值能确认是否是SV锁,通过P2可以确认哪些是Sequence发生过等待.SV锁争用问题发生时的解决办法与SQ锁的情况相同,就是CACHE值进行适当的调整,这也是唯一的方法。
    
     在RAC等多节点环境下,sequence的CACHE值给性能带来的影响比单节点环境更严重,因此,尽量赋予CACHE+NOORDER属性,并要给与足够大的CACHE值,但为了保障顺序
 实例之间不断发生数据的交换,因此,与赋予了NOORDER属性的时候相比性能稍差。
    
     有一点必须注意:
     没有赋予CACHE属性时,不管ORDER属性是否或RAC环境是否,一直等待ROW CACHE事件,ROW CACHE LOCK是否可以在全局范围内使用的锁,但实例环境或多实例环境同意可以发生,
 根据创建Sequence时赋予的属性,整理等待事件的结果如下:
    
     --NOCACHE : rowcache lock
     --CAHCE+NOORDER enq:SQ-contention
     --CACHE+ORDER(RAC): DFS look handle
    
    
 
阅读(3245) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~