Oracle序列中Cache与NoCache的区别及何时使用

Oracle序列中Cache与NoCache的区别及何时使用Oracle 在创建序列 sequence 时有个参数你可以选择 cache 或者 nocache 下面来讲一下两者的区别 先来看下创建 sequence 的语句 create sequence SEQ ID nbsp minvalue 1 nbsp maxvalue

欢迎大家来到IT世界,在知识的湖畔探索吧!

Oracle在创建序列(sequence)时有个参数你可以选择cache或者nocache,下面来讲一下两者的区别:

先来看下创建sequence的语句:

create sequence SEQ_ID   minvalue 1   maxvalue    start with 1   increment by 1   cache n / nocache --其中n代表一个整数,默认值为20 order;

欢迎大家来到IT世界,在知识的湖畔探索吧!

如果指定CACHE值,Oracle就可以预先在内存里面放置一些Sequence,这样存取的快些。cache里面的取完后,Oracle自动再取一组到cache。使用cache或许会跳号, 比如数据库突然不正常down掉(shutdown abort),cache中的Sequence就会丢失。举个例子:比如你的sequence中cache 100,那当你sequence取到90时突然断电,那么在你重启数据库后,sequence的值将从101开始。

如果指定NOCACHE值,Oracle就不会预先在内存里面存放Sequence,当然这也就可以避免数据库不正常down掉的sequence丢失。不过会产生一些问题:创建nocache sequence在高并发访问时,容易导致row cache lock等待事件,主要原因是每次获取nextval时都需要修改rowcache中的字典信息。使用nocache sequence,还会导致如下问题:

由于每次修改字典信息都需要commit,可能导致log file sync等待,nocache sequence在RAC环境下,会对基于sequence生成的列创建的索引造成实例间大量索引块争用 基于以上问题,避免创建nocache sequence。

再来看看sequence相关保护机制:

  • row cache lock 在调用sequence.nextval情况下需要修改数据字典时发生,对应row cache lock事件
  • SQ lock 在内存缓存(并非rowcache)上获取sequence.nextval时发生,对应enq:SQ-contention事件
  • SV lock RAC环境下获取cache+order属性的sequence.nextval时发生,对应DFS lock handle事件

什么情况下使用cache什么时间上使用nocache?

我个人感觉应该尽量使用cache,因为现在的数据库很多都是在高并发的情况下运行的,首先这样可以搞性能,并且也不会产生row cache lock等待事件。可能有些人会担心数据库不正常的down掉会产生序列号间断,但这也是很少的情况。当然如果你的业务要求是绝不能产生间断的序列号,那就要使用nochache了。

上述文字也同时解释了为什么oracle的sequence会出现跳号的现象

参考

https://blog.51cto.com/zhangdivy/ https://bytes.com/topic/oracle/answers/-sequence-nextval-incrementing-itself-over-time

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://itzsg.com/93238.html

(0)
上一篇 5小时前
下一篇 5小时前

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

联系我们YX

mu99908888

在线咨询: 微信交谈

邮件:itzsgw@126.com

工作时间:时刻准备着!

关注微信