oracle seq

一. 理论知识

先看一个创建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>

猜你喜欢

转载自cai-bird.iteye.com/blog/2007650
seq
今日推荐