暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

骨灰级科普-Oracle的序列可能不连续

InDataBase 2021-04-26
2731

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不连续,

所以你没事别异常关机、别刷新共享池,虽然实例能运行,但好多东西都需要重新设置。



翻翻历史,温故知新

后台翻页必用的rownum,你知道它的处理逻辑吗?

总在面试时被问COUNT(*)、COUNT(1)哪个快?

NVL系与Decode系,他们的差别你了解吗?

骨灰级科普-Oracle中的NULL,神马也不是

SQL也可以不那么简单


文章转载自InDataBase,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论