ITPub博客

首页 > Linux操作系统 > Linux操作系统 > SEQUENCE — cache 的用处

SEQUENCE — cache 的用处

原创 Linux操作系统 作者:hujianwind 时间:2009-04-07 21:43:01 0 删除 编辑

SEQUENCE — cache 的用处
在创建序列的语法中,有一个子句为 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 的大小。

文章出处:http://www.diybl.com/course/7_databases/oracle/oraclejs/20081012/150411.html

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/14999074/viewspace-586530/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2009-02-18

  • 博文量
    67
  • 访问量
    95623