一、之前认识
之前对sequence的 cache的理解,是oracle分配的内存,但却始终没明白实质。
二、所遇情况
数据表里用到sequence,sequence是这样定义的
-- Create sequence
create sequence TEST
minvalue 10000
maxvalue 9999999
start with 10962
increment by 1
cache 20;
通过PL/SQL观察看到,TEST sequence显示 next number 显示 10962,
而通过查询TEST sequence的current value 是 10942,
可TEST sequence定义的是 increment by 1,不知道为什么会相差20,
直到今天才真正明白cache的意思。
三、最终认识
Cache 参数:
如果指定CACHE值,ORACLE就可以预先在内存里面放置一些sequence,这样存取的快些。cache里面的取完后,oracle自动再取一组到cache。
使用cache或许会跳号,比如数据库突然不正常down掉(shutdown abort),cache中的sequence就会丢失. 所以可以在create sequence的时候用nocache防止这种情况。但是nocache 的性能较差。 如果指定cache而没有设定cache值,默认cache是20个。 这个默认值对于大多数情况下都是够用的。 除非那种每秒上万次的select。
原来next number显示的值,是依据cache来显示的;
而实质应用中,next value 的确是increment by 1 ,所以下次取值时,会是10943;
应用每次取值,next number 同样也会加 1 ,但是始终会和current value保持相差20(cache 里定义的值).