Oracle:sequence问题研究

    一直以来,以为sequence是不间断地持续增长的;但今天发现sequence是会跳号,这种情况发生在RAC环境下。在单实例环境下,应该不存在的。

 sequence截图如下:

Oracle:sequence问题研究_第1张图片

 

数据库表中发生了跳号:

Oracle:sequence问题研究_第2张图片

 

查看了实例db1:

Oracle:sequence问题研究_第3张图片

 

查看了实例db2:

Oracle:sequence问题研究_第4张图片

 

通过pl/sql查看nextval

Oracle:sequence问题研究_第5张图片

 

    从上面我们知道,在RAC环境下,sequence确实会发生跳号现象。但不管如何,sequence是不会重复的。

 

下面是从网上查找的深层次原因:

   oracle为了在rac环境下为了sequence的一致性,使用了三种锁:row cache lockSQ锁、SV锁。

row cache lock的目的是在sequence指定nocache的情况下调用sequence.nextval过程中保证序列的顺序性;

SQ锁是应用于指定了cache+noorder的情况下调用sequence.nextval过程中。

SV锁(dfs lock handel) 是调用sequence.nextval期间拥有的锁。前提是创建sequence时指定了cache order属性 (cache+order)

order参数的目的是为了在RAC上节点之间生成sequence的顺序得到保障。

 

   创建sequence赋予的cache值较小时,有enq:sq-contention等待增加的趋势。

cache的缺省值是20.因此创建并发访问多的sequence时,cacheh值应取大一些。否则会发生enq:sq-contention等待事件。

 

    rac上创建sequence时,如果指定了cache大小而赋予noorder属性,则各节点将会把不同范围的sequencecache到内存上。若两个节点之间都必须通过依次递增方式使用sequence,必须赋予如下的order属性(一般不需要这样做)"sql> create sequence seq_b cache 100 order"。如果是已赋予了cache+order属性的sequenceoracle使用SV锁进行同步。SV锁争用问题发生时的解决方法与sq锁的情况相同,就是将cache 值进行适当调整。

 

    在 RAC 多节点环境下, Sequence Cache 属性对性能的影响很大。应该尽量赋予 cache+noorder 属性,并要给予足够的 cache 值。如果需要保障顺序,必须赋予 cache+order 属性。但这时为了保障顺序,实例之间需要不断的交换数据。因此性能稍差。

 

 

你可能感兴趣的:(sequence)