oracle rac环境中的sequence


oracle为了在rac环境下为了sequence的一致性,使用了三种锁:row cache lock、SQ锁、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属性,则各节点将会把不同范围的sequence值cache到内 存上。若两个节点之间都必须通过依次递增方式使用sequence,必须赋予如下的order属性(一般不需要这样做)”sql> create sequence seq_b cache 100 order”。如果是已赋予了cache+order属性的sequence,oracle使用SV锁进行同步。SV锁争用问题发生时的解决方法与sq锁 的情况相同,就是将cache 值进行适当调整。

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

Oracle序列创建和使用

创建序列 
语法 CREATE SEQUENCE 序列名 [相关参数]
参数说明 
INCREMENT BY :序列变化的步进,负值表示递减。(默认1) 
START WITH:序列的初始值 。(默认1) 
MAXvalue:序列可生成的最大值。(默认不限制最大值,NOMAXVALUE) 
MINVALUE:序列可生成的最小值。(默认不限制最小值,NOMINVALUE) 
CYCLE:用于定义当序列产生的值达到限制值后是否循环(NOCYCLE:不循环,CYCLE:循环)。 
CACHE:表示缓存序列的个数,数据库异常终止可能会导致序列中断不连续的情况,默认值为20,如果不使用缓存可设置NOCACHE
例 
CREATE SEQUENCE SEQ_DEMO 
INCREMENT BY 1 
START WITH 1 
NOMAXvalue 
NOCYCLE 
NOCACHE;

修改、删除序列

使用 alter 命令进行修改
使用 drop 命令删除
序列的使用 
currval 表示序列的当前值,新序列必须使用一次nextval 才能获取到值,否则会报错
nextval 表示序列的下一个值。新序列首次使用时获取的是该序列的初始值,从第二次使用时开始按照设置的步进递增
查询序列的值:select seq_name.[currval,nextval] from dual;
SQL语句中使用:insert into table (id) values (seq_name.nextval)
--------------------- 

seqence的作用:

sequence号是数据库系统按照一定规则自增的数字序列,因为自增所以不会重复。目前就我所了解的sequence的作用主要有两个方面。

一:作为代理主键,唯一识别;

二:用于记录数据库中最新动作的语句,只要语句有动作(I/U/D等),sequence号都会随着更新,所以我们可以根据sequence号来select出更新的语句。

sequence的用法:

sequence和创表类似,需要创建一个sequence,然后表的一个int型字段可以使用这个sequence。

创建一个sequence(db2,oracle均适用)

create seqence sequence_name 

[start with n1] 

[increment by n2] 

[maxvalue n3|no maxvalue] 

[minvalue n4|no minvalue] 

[cache n5|no cache] 

[cycle|no cycle] 

[order|no order]

----------------->n1到n5都是整数

----------------->start with 生成的第一个n1值

-----------------> increment by n2 递增量,可以为正整数或负整数,指明每一次增加多少

----------------->maxvalue最大值,no maxvalue用于指定序列没有上限

----------------->minvalue 最小值,no minvalue,没有指定最小下限

----------------->cache 用高速缓存中可以预分配的序列号个数,默认是20。 如果缓存中的序列号没有用完就关闭数据库等其它原因. 没有使用的序列号就丢失了,所以不能保证序列号是连续的。nocache高速缓冲中不预分配序列号,每次只生成一个序列号,虽然降低了获取序列号的速度,但是可以保证序列号的连续性。

----------------->cycle 序列达到最大值或最小值后是否循环。再从n1开始循环,默认不no cycle

----------------->order用于指定按顺序生成序列,只有在RAC时需要指定,指定ORDER 是为了保证序列号是因为有请求才生成的。在使用序列号做为一个时间戳时很有用,no order是不指定按顺序生成序列(默认)。

创建一个sequence:

create sequence sequence_name as int minvalue 1000 maxvalue 1000000000 start with 1000 increment by 1 no cache;

或者

create sequence sequence_name minvalue 1000 no maxvalue start with 1000 increment by 1 no cache;

sequence的使用:

sequence_name.nextval ------->引用下一个序列值

sequence_name.currval /seqence_name.nextval.currval -------->引用当前序列值,必须最少经过一个nextval才能引用currval

在表中使用sequence:

create table tab_name(col_int int, col_varchar varchar(20), col_seq int);

insert tab_name into values(1, ‘abc’, nextval for sequence_name); 或者 insert tab_name into values(1, ‘xyz’, sequence_name.nextval);

insert tab_name into values(2, ‘fgh’, nextval for sequence_name); 或者 insert tab_name into values(2, ‘fgh’, sequence_name.nextval);

update tab_name set col_varchar=‘678’, col_seq=sequence_name.nextval where col_int=2;

delete tab_name col_sql=sequence_name.nextval where col_int=1;

单独使用查询sequence:

select sequence_name.nextval from dual; ------>每执行一次sequence号会一直增加

select sequence_name.currval from dual; ------->执行多少次都不会变化

改变sequence:

比如对以上创建的sequence除了初始值以外的值进行修改,alter sequence_name minvalue 100000 maxvalue 99999999 increment by 10 cache 10 cycle;

删除sequence:

drop sequence sequence_name;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值