Oracle的sequence( 二 )


CYCLE/NOCYCLE:指定当序列达到最大(升序序列)和最小(降序序列)值的时候 , 序列是否要循环使用 。
ORDER/NOORDER:默认情况下是NOORDER , 这两个参数控制着序列是否按照顺序生成 。 只有在RAC环境中 , 这两个参数才有相应的实际意义 。
CACHE/NOCACHE:
cache指定一次从数据字典中预分配多少个值 , 然后把这些值放在内存中以提供访问 , 这样就能提高访问速度 。 当内存中的值全部被使用完毕以后 , 再从数据字典中预分配这些值并且cache到内存 , 如此往复 。 同样 , cache指定的这个数字的必须是少于28个 , 且其最小值是2 。
两个重要的概念:
The Number of Entries in the Sequence Cache: When an application accesses a sequence in the sequence cache, the sequence numbers are read quickly. However, if an application accesses a sequence that is not in the cache, then the sequence must be read from disk to the cache before the sequence numbers are used.
The Number of Values in Each Sequence Cache Entry : When a sequence is read into the sequence cache, sequence values are generated and stored in a cache entry. These values can then be accessed quickly. The number of sequence values stored in the cache is determined by the CACHE parameter in the CREATE SEQUENCE statement. The default value for this parameter is 20.
可见sga中的sequence cache放的是sequence cache entries(就是许多sequece的cache) , 而一个sequence cache entry中存放了这个sequence的多个values(单个sequence的多个value) 。 CACHE参数就是控制着单个sequence可以缓存多少value的 。 默认值是20 , 即你不指?ACHE , 也不指定NOCACHE , 那么就表示CACHE=20 。
当使用NOCACHE的时候 , 这样这个sequence的就不会缓存到内存 , 于是对它的每一次访问都会导致一个物理读和一个逻辑读 。
使用CACHE参数 , 是否会带来相关的隐患呢?答案是肯定有的 。 当发生实例失败的时候 , 在内存中的那些sequence值都会丢失 , 也就是出现了sequence的“跳跃” 。 还有当在EXP/IMP的时候 , 如果在exp执行期间仍然有事务在访问该sequence , 则次sequence也可能会出现“跳跃” 。
有关CACHE参数值的设定 , 还有一个限制:
For sequences that cycle, this value must be less than the number of values in the cycle. You cannot cache more values than will fit in a given cycle of sequence numbers. Therefore, the maximum value allowed for CACHE must be less than the value determined by the following formula:
(CEIL (MAXVALUE - MINVALUE)) / ABS (INCREMENT)
修改
要想修改自己的序列 , 你必须拥有ALTER SEQUENCE 权限;如果是修改其他用户的序列 , 你则必须要拥有ALTER ANY SEQUENCE权限 。 下面 , 我们来看一下修改语法:
Oracle的sequence文章插图
删除
要想删除自己的序列 , 你必须拥有DROP SEQUENCE 权限;如果是删除其他用户的序列 , 你则必须要拥有DROP ANY SEQUENCE权限 。 下面 , 我们来看一下删除语法:
Oracle的sequence文章插图
有关sequence的视图
seq$
user_sequences
all_sequences
dba_sequences
seq
FAQ
如何增加sequence到指定的值?
由于sequence的值只能安装增加的比例增加 , 所以一种方法就是利用plsq的循环来实现 , 如下:
declare
mein number;
begin
for i in 149 .. 2000 loop
select SEQ_BMW_PUNISH_PERMISSION_R_ID.nextval into mein from dual;
end loop;
dbms_output.put_line(\'ok\');
end;