具体的说解决办法有2个:
1.设置cache 的值为空,(通过PLSQL查看显示为0);
2.创建序列的时候,增加order属性,使用cache+order属性 ;
oracle为了在rac环境下为了sequence的一致性,使用了三种锁:rowcachelock、SQ锁、SV锁。
rowcachelock的目的是在sequence指定nocache的情况下调用sequence.nextval过程中保证序列的顺序性;
cache参数告诉oracle预先分配一个sequencenumbers的集合,并且保留在内存中,以便sequencenumber能够被快速的访问。这个内存的大小就是cache所指定的大小,当多个用户同时访问一个sequence的时候,是在oracleSGA中读取sequence当前的合理数值,如果并发访问太大,cache的大小不够,那么就会产生sequencecache相关的等待(enq:SQ-contention),影响系统性能。
在RAC多节点环境下,Sequence的Cache属性对性能的影响很大。应该尽量赋予cache+noorder属性,并要给予足够的cache值。(这种情况就造成了今天广西的这种情况)
如果需要保障顺序,必须赋予cache+order属性。但这时为了保障顺序,实例之间需要不断的交换数据。因此性能稍差。
本文除了讲述oracle sequence的一般用法外,还着重说明了sequence在rac环境中容易引起的性能问题和分析解决方法。
sequence的概念及作用
sequence是用来在多用户环境下产生唯一整数的数据库对象。序列产生器顺序生成数字,它可用于自动生成主键值,并能协调多行或者多表的主键操作。没有sequence,顺序的值只能靠编写程序来生成。先找出最近产生的值然后自增长。这种方法要求一个事务级别的锁,这将导致在多用户并发操作的环境下,必须有人等待下一个主键值的产生。而且此方法很容易产生主键冲突的错误,如下图:
time a......trans1 begin.........................................................
|
取max value=5
|
time b......max value+1=6........trans2 begin.....................
||
other actionmax value=5
||
time c.....commit;max value+1=6
|
commt(ora-00001)
如上图,事务2会报主键冲突的错误,而再刷新一下页面(再执行一边程序),可能就正常了。
还有一个问题,那就是完成生成主键的程序(一般情况包含plsql块)本身对于并发调用也是一个瓶颈,因为这样的程序段往往是提供给好多程序去调用,如果代码端写的不够优化(比如没有使用邦定变量等等),或者此代码段存在问题,那么它所影响的是系统的全局。我们应该提倡开发人员使用sequence。sequence消除了序列化问题,而且改善了应用的并发能力。
创建sequence
sequence的命名最重要的是要统一,命名规则是次要的。
CREATE SEQUENCE emp_sequence
INCREMENT BY 1
START WITH 1
NOMAXVALUE
NOCYCLE
CACHE 10;
这里需要重点说明的是cache参数,它是为了应对并发访问的。cache参数告诉oracle预先分配一个sequence numbers的集合,并且保留在内存中,以便sequence number能够被快速的访问。这个内存的大小就是cache所指定的大小,当多个用户同时访问一个sequence的时候,是在oracle SGA中读取sequence当前的合理数值,如果并发访问太大,cache的大小不够,那么就会产生sequence cache相关的等待(enq: SQ - contention),影响系统性能。
既然cache涉及到了内存,那么就会想到oracle实例恢复的问题。如果数据库shutdown abort,sequence会如何呢?当然会有问题,sequence number保存在内存里的但是没有被应用到表中的会丢失!
修改sequence
除了修改sequence的starting number,你什么都能改,如果想改starting number,只能先drop然后create。
ALTER SEQUENCE emp_sequence
INCREMENT BY 10
MAXVALUE 10000
CYCLE
CACHE 20;
修改很有用,最典型的情况是“需要把sequence 的current value改大一点,避免程序报错!”。你就可以看看current value是多少,然后修改increment by 足够大的值,然后执行.nextval,最后别忘了再将increnent by改成原来的值,还要注意做这些工作的前提是当前没有人用此sequence。
使用 sequence
CURRVAL 和 NEXTVAL 能够在以下情况使用:
insert的values字句、select中的select列表、update中的set字句
CURRVAL 和 NEXTVAL 不能够在以下情况使用:
子查询、视图和实体化视图的查询、带distinct的select语句、带group by和order by的select语句、带union或intersect或minus的select语句、select中的where字句、create table与alter table中的default值、check约束条件。
删除sequence
drop sequence seq_a;
当删除sequence后,对应它的同义词会被保留,但是引用时会报错。
oracle rac环境中的sequence
oracle为了在rac环境下为了sequence的一致性,使用了三种锁:row cache lock、SQ锁、SV锁。
row cache lock的目的是在sequence指定nocache的情况下调用sequence.nextval过程中保证序列的顺序性;
SQ锁是应用于指定了cache+noorder的情况下调用sequence.nextval过程中。
SV锁(dfs lock handel) 是调用sequence.nextval期间拥有的锁。前提是创建sequence时指定了cache 和order属性 (cache+order)。order参数的目的是为了在RAC上节点之间生成sequence的顺序得到保障。
创建sequence赋予的cache值较小时,有enq:sq-contention等待增加的趋势。
cache的缺省值是20.因此创建并发访问多的sequence时,cacheh值应取大一些。否则会发生enq:sq-contention等待事件。
rac上创建sequence时,如果指定了cache大小而赋予noorder属性,则各节点将会把不同范围的sequence值cache到内存上。若两个节点之间都必须通过依次递增方式使用sequence,必须赋予如下的order属性(一般不需要这样做)
sql> create sequence seq_b cache 100 order;
如果是已赋予了cache+order属性的sequence,oracle使用SV锁进行同步。SV锁争用问题发生时的解决方法与sq锁的情况相同,就是将cache 值进行适当调整。
在RAC多节点环境下,Sequence的Cache属性对性能的影响很大。应该尽量赋予cache+noorder属性,并要给予足够的cache值。如果需要保障顺序,必须赋予cache+order属性。但这时为了保障顺序,实例之间需要不断的交换数据。因此性能稍差。
分享到:
相关推荐
【OGG】RAC环境下配置OGG单向同步 (四).pdf【OGG】RAC环境下配置OGG单向同步 (四).pdf
操作系统:Red Hat Enterprise Linux ...发现备库(单实例)与主库不同步,检查发现日志中断了好长时间,由于之前主库出现过归档空间不足的情况,手动清除了归档,导致缺少日志同步不过去,一直显示等待6392号归档:
Oracle排错 DBCA建库诡异问题处理--rac环境不能创建rac库
RAC环境下网卡绑定.可以直接修改配置文件,复制进系统目录即可使用
【故障处理】BLOG_DBCA建库诡异问题处理--rac环境不能创建rac库.pdf【故障处理】BLOG_DBCA建库诡异问题处理--rac环境不能创建rac库.pdf
模拟环境下RAC下开启归档详细记录,带图片
aix下RAC环境巡检, 查看操作系统(AIX 文件系统是否合理) 查看操作系统是否打齐补丁 等
OGG 12c Oracle RAC到单实例同步 归档在本地搭建案例
Oracle RAC环境下开启FLASHBACK闪回功能.pdf
oracle rac环境下索引热块的处理思路oracle rac环境下索引热块的处理思路
Oracle RAC环境,归档放到本地和放到ASM存储,备份规则是不同的。
Oracle10g RAC环境下DataGuard备库搭建实例
浦东机场货运站核心数据库升级至Oracle RAC 11gR2。操作系统采用RedHat Enterprice Linux 6.3 x64,操作系统平台为x86-64。 Oracle网格管理器和...主RAC和备RAC各2个节点,2套RAC采用Active Data Guard做实时同步。
为oracleRAC环境下修改字符集提供可靠依据。可为rac环境下修改其他参数提供参考。
RedHat 5 下安装 Oracle 11gR2 RAC 环境
本文详细图文介绍了在oracle rac环境下多个scan ip的修改方法,保证能修改成功
Linux RAC环境清理的文档,平时工作的时候用的,用了很多次
Oracle RAC 环境中 gc block lost 和私网通信性能问题的诊断
在RAC环境下开启归档模式,为备份系统使用的准备工作。
Oracle RAC环境搭建手册 350页