欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Oracle在创建序列(sequence)时该如何选择参数cache或者nocache?

程序员文章站 2022-06-16 15:04:58
oracle在创建序列(sequence)时该如何选择参数cache或者nocache? 下面来讲一下两者的区别: 先来看下创建sequence的语句: create sequenceseq_id...

oracle在创建序列(sequence)时该如何选择参数cache或者nocache?

下面来讲一下两者的区别:

先来看下创建sequence的语句:

create sequenceseq_id

minvalue 1

maxvalue 99999999

start with 1

increment by 1

cachen / nocache --其中n代表一个整数,默认值为20

order;

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

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

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

基于以上问题,避免创建nocache sequence。

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

rowcachelock:在调用sequence.nextval情况下需要修改数据字典时发生,对应rowcachelock事件

sq lock:在内存缓存(并非rowcache)上获取sequence.nextval时发生,对应enq:sq-contention事件

sv lock:rac环境下获取cache+order属性的sequence.nextval时发生,对应dfs lock handle事件

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

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