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 

你可能感兴趣的:(Oracle sequence)