Oracle创建Sequence时有个参数,你可以选择cache或nocache。
先来看下创建sequence的语句:
create sequence SEQ_1
minvalue 1
maxvalue 99999999
start with 1
increment by 1
cache n nocache --其中n代表一个整数,默认值为20
order;
如果指定cache值,Oracle就可以预先在内存里面放置一些Sequence,这样存取的快些。
cache里面的取完后,Oracle自动再取一组到cache。
但使用cache可能出现不连号的现象。
看实验:
创建一个序列,cache为3000
如果数据库正常关闭,然后重启,再获取SEQ_1,应该是多少呢?
如果数据库异常关闭,然后重启,再获取SEQ_1,还能连续吗?
小结:
正常关闭数据库 Oracle会把cache信息同步到 SEQ$ 里面所以下次查询的话不会产生丢失。
非正常关闭数据库,Oracle内部的一些处理都还没有来处理,所以cache丢失。
仅是异常关闭会将cache清空吗?
不是的,因为cache存在于共享池中,如果刷新共享池,也能让cache清空。
如何避免刷新共享池,不清空cache呢?
可以通过Keep的方式把sequence固定到共享池中。
PS:默认数据库没有Keep,需要执行脚本,增加此功能
那么如果有Keep之后,异常关机,sequence会怎么样?
从实验结果来看,cache依然被清空,之前设置的KEEP也没有。
重启后需要重新KEEP到共享池中。
所以你应该了解Sequence为什么会不连续。
所以你应该知道不仅仅是异常关机会使Sequence不连续,
所以你没事别异常关机、别刷新共享池,虽然实例能运行,但好多东西都需要重新设置。
翻翻历史,温故知新