oracle sequence中squence并发如何处理

21293人阅读
&在oracle中sequence就是所谓的序列号,每次取的时候它会自动增加,一般用在需要按序列号排序的地方。& 1、Create&Sequence& 你首先要有CREATE&SEQUENCE或者CREATE&ANY&SEQUENCE权限,& CREATE&SEQUENCE&emp_sequence& &&&&INCREMENT&BY&1&&--&每次加几个& &&&&START&WITH&1&&&&--&从1开始计数& &&&&NOMAXVALUE&&&&&&--&不设置最大值& &&&&NOCYCLE&&&&&&&&&--&一直累加,不循环& &&&&CACHE&10;& 一旦定义了emp_sequence,你就可以用CURRVAL,NEXTVAL& &CURRVAL=返回&sequence的当前值& &NEXTVAL=增加sequence的值,然后返回&sequence&值& 比如:& &&emp_sequence.CURRVAL& &&emp_sequence.NEXTVAL& 可以使用sequence的地方:& -&不包含子查询、snapshot、VIEW的&SELECT&语句& -&INSERT语句的子查询中& -&NSERT语句的VALUES中& -&UPDATE&的&SET中&&& 可以看如下例子:& INSERT&INTO&emp&VALUES&& (empseq.nextval,&'LEWIS',&'CLERK',7902,&SYSDATE,&1200,&NULL,&20);& SELECT&empseq.currval&&&&&FROM&DUAL;& 但是要注意的是:& -&第一次NEXTVAL返回的是初始值;随后的NEXTVAL会自动增加你定义的INCREMENT&BY值,然后返回增加后的值。CURRVAL&总是返回当前SEQUENCE的值,但是在第一次NEXTVAL初始化之后才能使用CURRVAL,否则会出错。一次NEXTVAL会增加一次SEQUENCE的值,所以如果你在同一个语句里面使用多个NEXTVAL,其值就是不一样的。明白?& -&如果指定CACHE值,ORACLE就可以预先在内存里面放置一些sequence,这样存取的快些。cache里面的取完后,oracle自动再取一组到cache。&使用cache或许会跳号,&比如数据库突然不正常down掉(shutdown&abort),cache中的sequence就会丢失.&所以可以在create&sequence的时候用nocache防止这种情况。& 2、Alter&Sequence& 你或者是该sequence的owner,或者有ALTER&ANY&SEQUENCE&权限才能改动sequence.&可以alter除start至以外的所有sequence参数.如果想要改变start值,必须&drop&&sequence&再&re-create&.& Alter&sequence&的例子& ALTER&SEQUENCE&emp_sequence& &&&&INCREMENT&BY&10& &&&&MAXVALUE&10000& &&&&CYCLE&&&&--&到10000后从头开始& &&&&NOCACHE&;& 影响Sequence的初始化参数:& SEQUENCE_CACHE_ENTRIES&=设置能同时被cache的sequence数目。&& 可以很简单的Drop&Sequence& DROP&SEQUENCE&order_&
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:8027659次
积分:79380
积分:79380
排名:第5名
原创:1000篇
转载:87篇
评论:1407条
Skype:tianlesoftware
安徽DBA俱乐部,俱乐部整合安徽地区的IT资源,现有成员已经包含安徽大部分IT公司,俱乐部除了资讯信息分享之外,也会定期举行线下活动。欢迎安徽地区的DBA 加入.
QQ群:,备注,加群必须注明籍贯,该群只对安徽地区开放。
注意:加群必须注明表空间和数据文件关系
不要重复加群
----------------------
CNDBA_1: k群,大量空闲)
CNDBA_2: (满)
CNDBA_5: (满)
CNDBA_7: (满)
(2)(4)(10)(13)(6)(1)(1)(5)(1)(1)(1)(5)(6)(5)(1)(3)(5)(5)(3)(15)(21)(5)(5)(3)(21)(15)(9)(5)(26)(33)(7)(26)(35)(31)(22)(21)(34)(43)(17)(95)(51)(30)(51)(54)(41)(22)(28)(24)(24)(21)(14)(23)(24)(10)(12)(23)(29)(39)Oracle Squence 的使用原则_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
评价文档:
喜欢此文档的还喜欢
Oracle Squence 的使用原则
O​R​A​C​L​E
阅读已结束,如果下载本文需要使用
想免费下载本文?
把文档贴到Blog、BBS或个人站等:
普通尺寸(450*500pix)
较大尺寸(630*500pix)
你可能喜欢Oracle中如何创建序列
Oracle中如何创建序列
在oracle中sequence就是所谓的序列号,每次取的时候它会自动增加,一般用在需要按序列号排序的地方。&
&1、Create Sequence&
&你首先要有CREATE SEQUENCE或者CREATE ANY SEQUENCE权限,&
&CREATE SEQUENCE emp_sequence &INCREMENT BY 1 & -- 每次加几个&
START WITH 1 & & -- 从1开始计数
&NOMAXVALUE & & & -- 不设置最大值
&NOCYCLE & & & & &-- 一直累加,不循环
&CACHE 10;&
一旦定义了emp_sequence,你就可以用CURRVAL,NEXTVAL&
CURRVAL=返回 sequence的当前值&
NEXTVAL=增加sequence的值,然后返回 sequence 值&
emp_sequence.CURRVAL&
emp_sequence.NEXTVAL&
可以使用sequence的地方:
&- 不包含子查询、snapshot、VIEW的 SELECT 语句 &- INSERT语句的子查询中
&- NSERT语句的VALUES中
&- UPDATE 的 SET中
&可以看如下例子:
&INSERT INTO emp VALUES
&(empseq.nextval, 'LEWIS', 'CLERK',7902, SYSDATE, 1200, NULL, 20);&
&SELECT empseq.currval & & &FROM DUAL;&
&但是要注意的是:
&- 第一次NEXTVAL返回的是初始值;随后的NEXTVAL会自动增加你定义的INCREMENT BY值,
然后返回增加后的值。CURRVAL 总是返回当前SEQUENCE的值,
但是在第一次NEXTVAL初始化之后才能使用CURRVAL,否则会出错。
一次NEXTVAL会增加一次SEQUENCE的值,所以如果你在同一个语句里面使用多个NEXTVAL,其值就是不一样的。明白?
&- 如果指定CACHE值,ORACLE就可以预先在内存里面放置一些sequence,这样存取的快些。
cache里面的取完后,oracle自动再取一组到cache。 使用cache或许会跳号,
&比如突然不正常down掉(shutdown abort),cache中的sequence就会丢失.&
所以可以在create sequence的时候用nocache防止这种情况。
&2、Alter Sequence&
&你或者是该sequence的owner,或者有ALTER ANY SEQUENCE 权限才能改动sequence. 可以alter除start至以外的所有sequence参数.
如果想要改变start值,必须 drop & sequence 再 re-create .
&Alter sequence 的例子&
ALTER SEQUENCE emp_sequence
&INCREMENT BY 10
&MAXVALUE 10000 &CYCLE & & -- 到10000后从头开始&
NOCACHE ;&
影响Sequence的初始化参数:&
SEQUENCE_CACHE_ENTRIES =设置能同时被cache的sequence数目。
&可以很简单的Drop Sequence &DROP SEQUENCE order_
您对本文章有什么意见或着疑问吗?请到您的关注和建议是我们前行的参考和动力&&
您的浏览器不支持嵌入式框架,或者当前配置为不显示嵌入式框架。& oracle sequence 总结
oracle sequence 总结
Sequence是用来在多用户环境下产生唯一整数的数据库对象。序列产生器顺序生成数字,它可用于自动生成主键值,并能协调多行或者多表的主键操作。如果没有Sequence,顺序的值只能靠编写程序来生成。在表里设置初始值,程序根据最大值加一后自动增长。这种方法要求一个事务级别的锁,这将导致在多用户并发操作的环境下,必须有人等待下一个主键值的产生。而且这种方法很容易产生主键冲突的错误,不适合大中型系统设计、开发的需要。
还有一个问题,那就是完成生成主键的程序(一般情况包含plsql块)本身对于并发调用也是一个瓶颈,因为这样的程序段往往是提供给好多程序去调用,如果代码端写的不够优化(比如没有使用邦定变量等等),或者此代码段存在问题,那么它所影响的是系统的全局。这里我们提倡设计开发人员使用Sequence, sequence消除了序列化问题,而且改善了应用的并发能力。
如何创建Sequence
Sequence的命名最重要的是要统一,命名规则是次要的。
CREATE SEQUENCE mysequence
INCREMENT BY 1
START WITH 1
NOMAXVALUE
这里需要重点需要说明的是CACHE参数,它是为了应对并发访问的。cache参数告诉oracle预先分配一个sequence numbers的集合,并且保留在内存中,以便sequence number能够被快速的访问。这个内存的大小就是cache所指定的大小,当多个用户同时访问一个sequence的时候,是在Oracle的SGA中读取sequence当前的合理数值,如果并发访问太大,cache的大小不够,那么就会产生sequence cache相关的等待(enq: SQ – contention,在AWR报告中较为常见), 影响系统性能。
既然cache涉及到了内存,那么就会想到oracle实例恢复的问题。如果数据库shutdown abort,Sequence会如何呢?既然是在SGA中当然会有问题,Sequence number保存在内存里的但是没有被应用到表中的会丢失!
修改sequence
除了修改sequence的starting number,你什么都能改,如果想改starting number,只能先drop然后create。
ALTER SEQUENCE mysequence
INCREMENT BY 10
MAXVALUE 10000
修改很有用,最典型的情况是“需要把sequence 的current value改大一点,避免程序报错!”。你就可以看看current value是多少,然后修改increment by 足够大的值,然后执行.nextval,最后别忘了再将increnent by改成原来的值,还要注意做这些工作的前提是当前没有人用此Sequence, 比如应用系统在停止状态。
使用 sequence
CURRVAL 和 NEXTVAL 能够在以下情况使用:
insert的values字句、select中的select列表、update中的set字句
CURRVAL 和 NEXTVAL 不能够在以下情况使用:
子查询、视图和实体化视图的查询、带distinct的select语句、带group by和order by的select语句、带union或intersect或minus的select语句、select中的where字句、create table与alter table中的default值、check约束条件。
删除sequence
drop sequence seq_a;
当删除sequence后,对应它的同义词会被保留,但是引用时会报错。
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
如果是已赋予了cache+order属性的sequence,oracle使用SV锁进行同步。SV锁争用问题发生时的解决方法与sq锁的情况相同,就是将cache 值进行适当调整。
在RAC多节点环境下,Sequence的Cache属性对性能的影响很大。应该尽量赋予cache+noorder属性,并要给予足够的cache值。如果需要保障顺序,必须赋予cache+order属性。但这时为了保障顺序,实例之间需要不断的交换数据。因此性能稍差。
本文的评论功能被关闭了.
9101112131415
16171819202122
23242526272829您现在的位置: &&&&&&&&&&&&文章内容
快捷导航:
如何在Oracle中使用Sequence
来源:考试大&&&【考试大:中国教育考试第一门户】&&日
  在SQL Server数据库中可以自增字段,但在Oracle数据库中在建表的时候却没有这个选项,在实际的应用中,我们可以通过触发器(trigger)或者序列(sequence)来实现。
  创建sequence的语法:
create sequence Sequence_name
increment by 1 --表示从1开始计值
start with 1
--每次增长1
nomaxvalue / maxvalue 999999 --有两个可选值,
要么无最大值,要么指定最大值
minvalue 1 / nominvalue
--同maxvalue
cycle --表示达到最大值后从头开始,也可以为nocycle
cache 10 --指定cache的值。如果指定CACHE值,oracle就可以预先在内
存里面放置一些sequence,这样存取的快些。cache里面的取完后,oracle
自动再取一组到cache。使用cache或许会跳号, 比如数据库突然不正常down
掉(shutdown abort),cache中的
sequence就会丢失. 所以可以在create sequence的时候用nocache防止这种情况。
--指定排序
  序列提供两个方法:
  NextVal和CurrVal。NextVal是取序列的下一个值,一次NEXTVAL会增加一次sequence的值;CurrVal是取序列的当前值。例如,在插入记录时:
insert tablename(id) values(sequence_id.nextval);
--sequence_id为序列名
  大家需要注意的是,第一次NEXTVAL返回的是初始值;随后的NEXTVAL会自动增加你定义的INCREMENT BY值,然后返回增加后的值。CURRVAL总是返回当前sequence的值,但是在第一次NEXTVAL初始化之后才可以使用CURRVAL,否则会出现出错。
  注释:在使用powerdesign进行数据库设计时,powerdesigner对Oracle的支持有些差强人意,你会发现powerdesign会自动为序列名加上"",在Oracle中虽然可以执行成功,也可以看到序列存在,但是如果你运行select sequence_name.它就会提示序列(名)不存在!所以大家在键序列的时候需要特别的留意。
来源:考试大-
责编:冷客&&&
&考试大网校:计算机等级考试网络课程试听
暂无跟贴,欢迎您发表意见
考试大Oracle认证考试评论排行
1.&&评论2条
2.&&评论2条
3.&&评论1条
4.&&评论1条
5.&&评论1条
6.&&评论1条
主讲:陈翠娥
12345678910
12345678910

我要回帖

更多关于 oracle删除sequence 的文章

 

随机推荐