首页 > 数据库 > Oracle > SEQUENCE — 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 |
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/76103/viewspace-2124485/ ,如需转载,请注明出处,否则将追究法律责任。