一. 理论知识
先看一个创建Sequence的语句:
SQL> create sequence seq_tmp
increment by 1
start with 1
nomaxvalue
nocycle
;
序列已创建。
相关参数说明:
INCREMENT BY 1 -- 每次加几个
START WITH 1 -- 从1开始计数
NOMAXvalue -- 不设置最大值
NOCYCLE -- 一直累加,不循环
CACHE 10; --设置缓存cache个序列
CURRVAL=返回 sequence的当前值
NEXTVAL=增加sequence的值,然后返回 sequence 值
查看user_sequences 表的结构:
SQL> desc user_sequences;
查看刚才创建的序列seq_tmp 的值:
SQL> select * from user_sequences where sequence_name='SEQ_TMP';
取下一个sequence的值:
SQL> select seq_tmp.nextval from dual;
查看当前sequence的值:
SQL> select seq_tmp.currval from dual;
修改Cache 大小:
如果Cache已经指定,我们可以修改Cache 大小。 alter 命令可以修改sequence中除了start 以外的所有参数。
如:
alter sequence emp_sequence cache 100;
小结:
在自己的本本上测试的,Oracle 11gR2. 单Instance数据库单会话循环不间断取1-4万个值。
nocache: 2.26s 10000
cache:20 0.46s 10000
cache:100 0.37s 10000
cache:1000 1.31s 40000
nocache: 9.33s 40000
基本上cache 大于20的时候性能基本可以接受,nocache的时候性能确实很差.
在以后每次请求nextval的时候,Oracle就从服务器缓存中去获取序列值。而不需要更新数据字典信息。只有在分配到缓存的10个数字都已经分配完,或者因为缓存刷新操作剩余数字被清理的情况下,才会再次调用sequence分配机制,再次分出cache个数字。
在cache问题上,我们经常会疑惑为什么我们sequence生成的数字序列会“跳号”。这种跳号现象实际上就是因为cache的数字在缓存中因为各种原因被flush出,这样才导致生成的数字序列不连续。
注意:在有cache的情况下,sequence只能保证每次获取到的数字都是唯一、递增的,从来没有保证过数字的连续性。
hibernate hbm配置:
<id name="id" type="java.lang.Long">
<column name="ID" />
<generator class="sequence">
<param name="sequence">SEQ_emp</param>
</generator>
</id>
oracle seq
猜你喜欢
转载自cai-bird.iteye.com/blog/2007650
今日推荐
周排行