SEQUENCE — cache 的用处

在创建序列的语法中,有一个子句为 cache,它的用处是缓存指定个数的序列值。比如你设置的 cache 是20,那么在获取 nextval 时,Oracle 会直接从 cache 中取下一个序列值,如果 cache 中缓存的序列值没有了(比如 cache 中的序列值用完了,或者被手工清空了),那么 Oracle 会再次产生20个序列值,并放置 cache 中供使用,这样有助于提高序列值的获取速度。

-------------------------------
下面为测试:

01.SQL> select * from v$version;
02.
03.BANNER
04.----------------------------------------------------------------
05.Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Prod
06.PL/SQL Release 10.2.0.1.0 - Production
07.CORE 10.2.0.1.0 Production
08.TNS for 32-bit Windows: Version 10.2.0.1.0 - Production
09.NLSRTL Version 10.2.0.1.0 - Production
10.
11.SQL> create sequence SEQ_TEST1
12. 2 minvalue 1
13. 3 maxvalue 1000
14. 4 start with 1
15. 5 increment by 1
16. 6 cache 20
17. 7 order;
18.
19.序列已创建。
20.
21./*这里需要注意的是用dual得到的是一个值,但是用USER_SEQUENCES得到的是cache里的缓存的序列集合*/
22.-- //刚刚创建的序列必须先用 nextval 来获取一个初始值
23.SQL> select SEQ_TEST1.currval from dual;
24.select SEQ_TEST1.currval from dual
25. *
26.ERROR 位于第 1 行:
27.ORA-08002: 序列 SEQ_TEST1.CURRVAL 尚未在此会话中定义
28.
29.
30.SQL> select SEQ_TEST1.nextval from dual;
31.
32. NEXTVAL
33.----------
34. 1
35.
36.SQL> select SEQ_TEST1.currval from dual;
37.
38. CURRVAL
39.----------
40. 1
41.
42.-- //清空 cache 中缓存的序列值
43.SQL> alter system flush shared_pool;
44.
45.系统已更改。
46.
47.-- //查询当前值,没有变化,仍是1
48.SQL> select SEQ_TEST1.currval from dual;
49.
50. CURRVAL
51.----------
52. 1
53.
54.-- //查询下一个值:Oracle 发现 cache 中的序列值没有了,会再次产生20个序列值供使用。
55.-- //所以这里得到的结果不是2,而是21。
56.SQL> select SEQ_TEST1.nextval from dual;
57.
58. NEXTVAL
59.----------
60. 21
61.
62.-- 再试一次
63.SQL> alter system flush shared_pool;
64.
65.系统已更改。
66.
67.SQL> select SEQ_TEST1.currval from dual;
68.
69. CURRVAL
70.----------
71. 21
72.
73.SQL> select SEQ_TEST1.nextval from dual;
74.
75. NEXTVAL
76.----------
77. 41
78.
79.-- //问题:Oracle 下一次取的20个值是从哪里开始计算的呢,是 currval + 20,
80.-- //还是每个 cache + 20 呢?我们试验一下。
81.SQL> select SEQ_TEST1.nextval from dual;
82.
83. NEXTVAL
84.----------
85. 42
86.
87.-- //现在序列的当前值是42。如果是用 currval + 20 来计算,那么清空 cache 后,
88.-- //获得的 nextval 应该是62;如果是 cache + 20,那应该是 61。
89.-- //看看实验结果吧:
90.SQL> alter system flush shared_pool;
91.
92.系统已更改。
93.
94.SQL> select SEQ_TEST1.currval from dual;
95.
96. CURRVAL
97.----------
98. 42
99.
100.SQL> select SEQ_TEST1.nextval from dual;
101.
102. NEXTVAL
103.----------
104. 61
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值