设计兼职网站推荐,做网站跟app的区别,凡客诚品电话,网站建设客户源Sequence是很简单的#xff0c;如果最大程度利用默认值的话#xff0c;我们只需要定义sequence对象的名字即可。在序列Sequence对象的定义中#xff0c;Cache是一个可选择的参数。默认的Sequence对象是有cache选项的#xff0c;默认取值为20。这个默认值对于大多数情况下都…Sequence是很简单的如果最大程度利用默认值的话我们只需要定义sequence对象的名字即可。在序列Sequence对象的定义中Cache是一个可选择的参数。默认的Sequence对象是有cache选项的默认取值为20。这个默认值对于大多数情况下都是够用的。 除非那种每秒上万次的select。 所以具体情况要具体对待。 对于哪些大并发的系统最好设置在100以上。像移动的BOSS系统以1000为单位。
SEQUENCE 创建基本语法
CREATE SEQUENCE [schema.]sequence [INCREMENT BY integer] [START WITH integer] [MAXVALUE integer | NOMAXVALUE] [MINVALUE integer | NOMINVALUE] [CYCLE | NOCYCLE] [CACHE integer | NOCACHE] [ORDER | NOORDER]
eg
CREATE SEQUENCE emp_seq INCREMENT BY 1-- 每次加几个 START WITH 1 -- 从1开始计数 NOMAXVALUE -- 不设置最大值 NOCYCLE -- 一直累加不循环 CACHE N / NOCACHE --其中n代表一个整数默认值为20。
如果指定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 lockRAC环境下获取cacheorder属性的sequence.nextval时发生对应DFS lock handle事件
什么情况下使用cache什么时间上使用nocache?
个人感觉应该尽量使用cache因为现在的数据库很多都是在高并发的情况下运行的首先这样可以搞性能并且也不会产生row cache lock等待事件。可能有些人会担心数据库不正常的down掉会产生序列号间断但这也是很少的情况。当然如果你的业务要求是绝不能产生间断的序列号那就要使用nochache了。
序列的并发访问 序列总是在数据库中生成唯一值即使当多个用户并发地引用同一序列时也没有可察觉的等待或锁定。当多个用户使用 NEXTVAL 来增长序列时每个用户生成一个其他用户不可见的唯一值。 当多个用户并发地增加同一序列时每个用户看到的值是有差异的。例如一个用户可能从一个序列生成一组值如 1、4、6 和 8而另一个用户并发地从同一序列生成值 2、3、5 和 7。
假如在创建sequence时有意不选用cache选项有2点需要注意
1 访问效率降低没有cache功能的sequence取值将无法直接访问内存
2 不论是nocache还是cache , 每次访问nextval的过程都是不可逆的在同一session中在执行一系列dml和sequence的操作后用户执行rollback,希望将操作回滚但是sequence此时就显得异常顽固用掉的nextval将无法被重现。当下一次试图读取nextval时sequence的指针又移动到下一位了。
还有sequence不属于某个表也不属于某个字段sequence仅仅属于某个用户。
其实在创建了sequence后每个表都可以使用这个sequence但是这样会引起应用的很多麻烦因此建议每个表都使用一个sequence。
关于Sequence order 参数的说明
序参数oracle默认是NOORDER如果设置为ORDER在单实例环境没有影响在RAC环境此时多实例实际缓存相同的序列此时在多个实例并发取该序列的时候会有短暂的资源竞争来在多实例之间进行同步。因次性能相比noorder要差所以RAC环境非必须的情况下不要使用ORDER尤其要避免NOCACHE ORDER组合。
order确保按照请求次序递增生成序列数字在RAC环境中建议使用该选项。noorder不保证按请求次序生成默认是noorder。 Cache参数对Sequence的使用带来什么好处如果不设置会有什么问题 ?
1、Sequence Cache简析
简单的说Cache 就是Oracle每次向Sequence进行请求时分配出的独立数字数量。例如当我们使用seq_name.nextval获取一个 独立值时Oracle需要将sequence对象的数据字典信息更新。如果我们设置cache为10那么第一次请求nextval的时候就更新数据 字典信息增加10取出的10个号放在Oracle服务器的缓存中。
在以后每次请求nextval的时候Oracle就从服务器缓存中去获取序列值。而不需要更新数据字典信息。只有在分配到缓存的10个数字都已经分配完或者因为缓存刷新操作剩余数字被清理的情况下才会再次调用sequence分配机制再次分出cache个数字。
在cache问题上我们经常会疑惑为什么我们sequence生成的数字序列会“跳号”。这种跳号现象实际上就是因为cache的数字在缓存中因为各种原因被flush出这样才导致生成的数字序列不连续。
注意在有cache的情况下sequence只能保证每次获取到的数字都是唯一、递增的从来没有保证过数字的连续性。
如果我们不设置cache也就是不启用序列数字缓存机制有什么缺点呢 1、过多的Redo Log生成 a),对nocache的序列对象而言每次操作都会有600左右的redo log生成。 b),对cache的sequence对象而言redo size生成的频率显然是低得多(到达cahce size最大值时才会创建redo log)。
设置cache之后Oracle似乎不用为每次的nextval进行数据字典修改生成redo log记录。只有cache在内存中使用结束之后才会进行获取。
在实际的生产环境中我们对redo size无必要的生成是要尽力避免的。首先过多的redo log生成容易造成online redo log的写入量增加切换频繁。第二redo size和nocache的使用可能是伴随着频繁的commit动作进而是频繁的log buffer写入online log file的过程。同时归档量增加。同时在进行恢复的时候也要消耗更多的时间。
所以设置cache可以有效减少redo log的大小。
说明 如果我们处在一个高并发的情况下系统频繁的多会话请求sequence取值。如果我们的sequence没有设置cache那么每次都要更新数据字典都要进行commit操作。多个会话还会出现该sequence记录的争用出现等待事件row lock contention。
在RAC环境下cache和noorder选项的作用更大。在RAC中多个实例争用情况会让sequence设计的不合理效果放大。所以在没有特殊情况下还是设置合理的cache值减少系统潜在性能瓶颈。