RAC环境下的sequence详解
sequence只能保证唯一性,不能保证连续性
row cache lock :调用sequence.nextval过程中(nocache) SQ锁 : 调用sequence.nextval过程中(cache+noorder) SV锁(dfs lock handel) :RAC上节点之间顺序得到保障的的前提下,调用sequence.nextval期间拥有。赋予了cache + order属性的sequence上发生。 (cache+order)
在RAC环境中,序列的Cache问题可能会对性能有着决定性的影响,缺省的序列Cache值为20,这对RAC环境远远不够。如果存在序列号使用的竞争,就可能在数据库中看到明显的队列等待:enq: SQ - contention
在RAC情况下,可以将使用频繁的序列Cache值增加到10000,或者更高到50000,这些值在客户的环境中都有采用。
基本上cache 大于20的时候性能基本可以接受,最好设置100以上,nocache的时候性能确实很差,最大相差20倍.
排序参数:oracle默认是NOORDER,如果设置为ORDER;在单实例环境没有影响,在RAC环境此时,多实例实际缓存相同的序列,此时在多个实例并发取该序列的时候,会有短暂的资源竞争来在多实例之间进行同步。因次性能相比noorder要差,所以RAC环境非必须的情况下不要使用ORDER,尤其要避免NOCACHE ORDER组合
若两个节点之间都必须通过依次递增方式使用sequence,必须赋予如下的order属性
如果是已赋予了cache+order属性的sequence,oracle使用SV锁进行同步。SV锁争用问题发生时的解决方法与sq锁的情况相同,就是将cache 值进行适当调整。
在RAC多节点环境下,sequence的Cache属性对性能的影响很大。应该尽量赋予cache+noorder属性,并要给予足够的cache值。如果需要保障顺序,必须赋予cache+order属性。但这时为了保障顺序,实例之间需要不断的交换数据。因此性能稍差
在做XTTS迁移时,发现某一特定sequence未迁移至目标环境,决定在目标环境,根据源端的DDL语句重建.但客户要求,为防止sequence产生重号或跳号,
在目标环境下的sequence start with值,需要与源端连续. 1.相关视图dba_sequences,特别关注字段increment_by select * from dba_sequences where sequence_owner = 'HR' and sequence_name = 'MDRS_31C87C$'; 2.原端数据库当前会话中,如何生成nextval和读取currval [oravis@r12 ~]$ sqlplus hr/hr SQL*Plus: Release 11.1.0.7.0 - Production on Sat May 1 12:49:56 2010 Copyright (c) 1982, 2008, Oracle. All rights reserved. Connected to: Oracle Database 11g Enterprise Edition Release 11.1.0.7.0 - Production With the Partitioning, OLAP, Data Mining and Real Application Testing options HR@VIS> select MDRS_31C87C$.nextval from dual; 210 HR@VIS> select MDRS_31C87C$.currval from dual; 210 3.生成目标端创建sequence语句 --sequence with cache select 'create sequence ' || sequence_owner || '.' || SEQUENCE_NAME || ' start with ' || LAST_NUMBER || ' maxvalue ' || MAX_VALUE || ' minvalue ' || MIN_VALUE || ' increment by ' || INCREMENT_BY || ' cache ' || CACHE_SIZE || ' ' || decode(CYCLE_FLAG, 'N', 'NOCYCLE', 'CYCLE') || ' ' || decode(ORDER_FLAG, 'N', 'NOORDER', 'ORDER') || ' ;' "-- create seq scripts" from dba_sequences where cache_size != 0 and sequence_owner = 'HR' and sequence_name = 'MDRS_31C87C$'; --注:为保持sequence在目标端的值跟原端连续,last_number需要修改为:在原端环境的CURRVAL-INCREMENT_BY -sequence without cache select 'create sequence ' || sequence_owner || '.' || sequence_name || ' start with ' || last_number || ' maxvalue ' || max_value || ' minvalue ' || min_value || ' increment by ' || increment_by || ' NOCACHE ' || decode(cycle_flag, 'N', 'NOCYCLE', 'CYCLE') || ' ' || decode(order_flag, 'N', 'NOORDER', 'ORDER') || ' ;' "-- create seq scripts" from dba_sequences where cache_size = 0 and sequence_owner = 'BEN' and sequence_name = 'BEN_TCS_CAT_S'; --注:为保持sequence在目标端的值跟原端连续,last_number需要修改为:在原端环境的CURRVAL-INCREMENT_BY

浙公网安备 33010602011771号