设为首页 加入收藏

TOP

OracleSEQUENCE详细说明(一)
2015-07-24 10:06:17 来源: 作者: 【 】 浏览:0
Tags:OracleSEQUENCE 详细 说明
ORACLE SEQUENCE
ORACLE没有自增数据类型,如需生成业务无关的主键列或惟一约束列,可以用sequence序列实现。
CREATE SEQUENCE语句及参数介绍:


创建序列:需要有CREATE SEQUENCE或者CREATE ANY SEQUENCE权限,
CREATE SEQUENCE [ schema. ]sequence
[ { INCREMENT BY | START WITH } integer
| { MAXVALUE integer | NOMAXVALUE }
| { MINVALUE integer | NOMINVALUE }
| { CYCLE | NOCYCLE }
| { CACHE integer | NOCACHE }
| { ORDER | NOORDER }
];

CREATE SEQUENCE各参数详解:
schema指定在哪个用户的schema下创建sequence,如不指定,默认在当前用户下创建。
sequence指定要创建的sequence序列名
注意:如果只指定以上参数,将启动一个从1开始,以1为单位递增,没有最大值限制的递增序列。
如果要创建一个没有约束的序列,递增序列时:忽略MAXVALUE参数或指定NOMAXVALUE;递减序列:省略MINVALUE参数或指定NOMINVALUE。
如果要创建一个有限制的序列,递增序列时:指定MAXVALUE参数;递减序列:指定MINVALUE参数。此时序列达到限制后会报错:
如果要创建一个有限制的序列在达到限制后重新启动,指定MAXVALUE和MINVALUE后,还需要指定CYCLE。如果不指定MINVALUE,默认为NOMINVALUE,
这个值是1.
INCREMENT BY指定序列号间的间隔,这个整数值可以是任何正整数或负整数,但不能是0。这个值最多有28位数字。
绝对值必须小于MAXVALUE与MINVALUE的差异(如非在此区间报错:ORA-04005: INCREMENT must be less than MAXVALUE minus MINVALUE)。
如果这个值是负的,则该序列下降。如果该值为正,则序列上升。如果省略此子句,则间隔缺省为1。
START WITH指定要产生的第一个序列号。
此子句启动一个递增序列,要大于最小值;或启动一个递减序列,小于它最大值。
对于递增序列,默认值是序列中的最小值。对于递减的序列,默认值是序列中的最大值。这个整数值可以最多28位数字。
这个值和达到限制的最大/最小值后重新启动时的值没有关系(如递增序列创建时指定有最大值最小值且指定CYCLE,则序列达到最大值后,
会从最小值开始;如未指定兼包最小值,默认1开始。
MaxValue指定序列可生成的最大值。这个整数值可以最多28位数字。MAXVALUE必须>=START WITH、必须大于MINVALUE。
NOMAXVALUE:指定NOMAXVALUE表示递增序列的最大值是10的27次方,或递减序列最大值为-1。这是默认的。
MINVALUE:指定序列的最小值。这个整数值可以最多28位数字。MINVALUE必须<=START WITH的值和必须小于MAXVALUE。
如此处不符,报:ORA-04006: START WITH cannot be less than MINVALUE。不指定此参数时,默认是1.
NOMINVALUE:指定NOMINVALUE来表示递增的序列最小值为1,递减序列为负10的26次方。这是默认的。
CYCLE:指定循环,表明序列在达到它的最大或最小值后生成的值。当递增序列达到最大值后,再从最小值开始循环。
当递减序列达到最小值,从最大值开始循环。
NOCYCLE:指定NOCYCLE以指示该序列不能在达到其最大值或最小值后产生更多的值。这是默认的。
CACHE :指定 数据库为序列预分配多少个值放在内存中以便更快访问。这个整数值可以最多28位数字。该参数最小值为2;
这个值必须小于一个CYCLE循环的数(比如从1-100是一个循环,CACHE要小于100,不然可能 一次CACHE的值要有重复的会出错。
报错是:ORA-04013: number to CACHE must be less than one cycle)。
计算公式是:(CEIL (MAXVALUE - MINVALUE)) / ABS (INCREMENT)
如果 系统故障,内存中未使用的CACHE值会丢失,将会导致序列不连续。ORACLE建议在RAC中使用CACHE来提高性能。
NOCACHE :指定该序列值不被预分配。如果省略CACHE和NOCACHE,数据库默认会缓存20个序列号。
ORDER :只有在RAC时需要指定,指定ORDER 是为了保证序列号是因为有请求才生成的。在使用序列号做为一个时间戳时很有用。
NOORDER:这是默认的。


使用序列
序列生成的是一系列整数数字.一个序列中包含两个"伪列" ,分别为"Currval"和"Nextval",可以分别用来获取该序列的当前值和下一个值.
虽然我们在定义时指定序列初始值为1但并没有真正初始化该值. 当在检索序列的当前值前,必须通过检索序列的下一个值即Nextval来对序列进行
初始化操作.在选择了Nextval时,该序列就被初始化为1.


使用sequence时对系统性能大致有以下影响:
详见:http://blog.itpub.net/17203031/viewspace-717042
1.Seq$基表是记录系统sequence的数据字典表.每次调用nextval,会递归调用更新并COMMIT Seq$基表。
2.更新Seq$基表并提交会产生redo log--几百字节,COMMIT频繁会造成LGWR的压力;过多redo log生成,造成LGWR压力、恢复时费时等。
3.多个会话使用sequence可能出现争用,等待事件row lock contention
对于nocache/cache参数:
nocache:每次使用nextval,都会更新Seq$基表并COMMIT。
cache:只有在内存中cache的序列号使用完后才会重新获取sequence,才会更新Seq$基表并提交。
比如cache设置为2000,则在使用sequence时对性能影响比nocache小上千倍。
所以一般情况下,建议设置一个较大的cache值,用于进行性能的优化。(默认不指定nocache时是20)


#####################################################
ORACLE sequence创建示例:
create sequence bys.test_seq
increment by 3
start with 5
maxvalue 18
minvalue 4
cycle
cache 4;
在bys用户下创建名为test_seq的sequence
从5开始,每次增加3,最大值是18,最小值是4
允许重用,cache 4 表示会缓存四个序列号,比如5 8 11 14
当然在实验中也可以使用最简单的:create sequence bys.test_seq2; 其它参数不写,使用系统默认哈哈
#####################################################


ORACLE sequence修改和删除示例:
ALTER SEQUE
首页 上一页 1 2 下一页 尾页 1/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇RAC 下一篇ORACLE取周、月、季、年的开始时..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·如何理解c语言指针和 (2025-12-27 01:19:11)
·为什么C标准库没有链 (2025-12-27 01:19:08)
·玩转C语言和数据结构 (2025-12-27 01:19:05)
·MySQL 基础入门视频 (2025-12-26 23:20:22)
·小白入门:MySQL超详 (2025-12-26 23:20:19)