Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1702755
  • 博文数量: 136
  • 博客积分: 10021
  • 博客等级: 上将
  • 技术积分: 3261
  • 用 户 组: 普通用户
  • 注册时间: 2007-01-22 11:26
文章分类

全部博文(136)

文章存档

2010年(1)

2009年(26)

2008年(109)

我的朋友

分类: Oracle

2008-10-09 17:04:23

在创建序列的语法中,有一个子句为 cache,它的用处是缓存指定个数的序列值。比如你设置的 cache 是20,那么在获取 nextval 时,Oracle 会直接从 cache 中取下一个序列值,如果 cache 中缓存的序列值没有了(比如 cache 中的序列值用完了,或者被手工清空了),那么 Oracle 会再次产生20个序列值,并放置 cache 中供使用,这样有助于提高序列值的获取速度。
 
下面我们做个测试:
 
SQL> select * from v$version;
 
BANNER
----------------------------------------------------------------
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Prod
PL/SQL Release 10.2.0.1.0 - Production
CORE    10.2.0.1.0      Production
TNS for 32-bit Windows: Version 10.2.0.1.0 - Production
NLSRTL Version 10.2.0.1.0 - Production
 
SQL> create sequence SEQ_TEST1
  2  minvalue 1
  3  maxvalue 1000
  4  start with 1
  5  increment by 1
  6  cache 20
  7  order;
 
序列已创建。
 
-- 刚刚创建的序列必须先用 nextval 来获取一个初始值
SQL> select SEQ_TEST1.currval from dual;
select SEQ_TEST1.currval from dual
       *
ERROR 位于第 1 行:
ORA-08002: 序列 SEQ_TEST1.CURRVAL 尚未在此会话中定义
 

SQL> select SEQ_TEST1.nextval from dual;
 
   NEXTVAL
----------
         1
 
SQL> select SEQ_TEST1.currval from dual;
 
   CURRVAL
----------
         1
 
-- 清空 cache 中缓存的序列值
SQL> alter system flush shared_pool;
 
系统已更改。
 
-- 查询当前值,没有变化,仍是1
SQL> select SEQ_TEST1.currval from dual;
 
   CURRVAL
----------
         1
 
-- 查询下一个值:Oracle 发现 cache 中的序列值没有了,会再次产生20个序列值供使用。
-- 所以这里得到的结果不是2,而是21。
SQL> select SEQ_TEST1.nextval from dual;
 
   NEXTVAL
----------
        21
 
-- 再试一次
SQL> alter system flush shared_pool;
 
系统已更改。
 
SQL> select SEQ_TEST1.currval from dual;
 
   CURRVAL
----------
        21
 
SQL> select SEQ_TEST1.nextval from dual;
 
   NEXTVAL
----------
        41
 
-- 问题:Oracle 下一次取的20个值是从哪里开始计算的呢,是 currval + 20,
-- 还是每个 cache + 20 呢?我们试验一下。
SQL> select SEQ_TEST1.nextval from dual;
 
   NEXTVAL
----------
        42
 
-- 现在序列的当前值是42。如果是用 currval + 20 来计算,那么清空 cache 后,
-- 获得的 nextval 应该是62;如果是 cache + 20,那应该是 61。
-- 看看实验结果吧:
SQL> alter system flush shared_pool;
 
系统已更改。
 
SQL> select SEQ_TEST1.currval from dual;
 
   CURRVAL
----------
        42
 
SQL> select SEQ_TEST1.nextval from dual;
 
   NEXTVAL
----------
        61
 
结论:cache 可以用来提高序列值的获取速度,但有可能会浪费一些序列号,应该根据实际情况来设置 cache 的大小。
阅读(9992) | 评论(2) | 转发(0) |
给主人留下些什么吧!~~

烟花丶易冷2015-08-31 10:57:49

文明上网,理性发言...

chinaunix网友2009-03-31 14:04:57

谢谢分享!