Oracle 数据库序列相关等待事件解析
对于高并发系统,尤其秒杀系统,很容易因为数据库序列使用不当造成应用堵塞,本文从数据库等待事件的角度解析ORACLE数据库序列相关的等待事件,并总结序列使用的最佳实践。
1、序列相关基本概念
对于序列有两个重要的属性,一个是序列cache值大小,一个是序列的order属性,下面我们通过两个小测试说明这两个属性对序列的影响。
测试1:ordered和noorder测试
首先我们创建一个noorder属性的序列
在节点一调用该序列:
然后在节点二调用该序列:
我们发现节点一上序列取值是顺序的,而节点二是从序列的cache值之后开始取值的。
然后我们创建一个order属性的序列
在一节点调用
在二节点调用
对于ORDER属性的序列,在RAC的不同节点调用,序列值始终是连续的,跟序列的CACHE值无关。
测试2:序列取不同cache值时候的性能差异测试
我们分别创建nocache、cache值为100和cache值为10000的三个序列
用如下脚本分别用三个序列取10万个值,耗时统计如下
结果我们发现,cache值为100时耗时明显低于nocache,而cache值为10000比cache值为100耗时并没有提升很多,应通过测试对自己的序列选择合适的cache值。
2、与序列相关的几个等待事件
与序列相关的等待事件有三个row cache lock、enq:SQ-contention和enq: SV-contention。下边我们分别模拟下这三个等待事件,然后总结如果遇到大量的这类等待事件该如何处理。
我们可以通过如下SQL查看SQ和SV这两种锁的解释。
测试1:row cache lock序列等待模拟
创建一个NOCACHE的序列,并使用NOORDER属性
分别在三个会话执行如下sql
执行asql.sql
NOCACHE属性的序列,在调用SEQUENCE.NEXTVAL时候,会产生等待事件row cache lock。
测试2:enq: SQ - contention模拟
创建一个CACHE为5的序列,并使用NOORDER属性
分别在三个会话执行如下sql
执行asql.sql
有较小CACHE的序列,在多个会话调用SEQUENCE.NEXTVAL的时候,会因为获取SQ锁而产生争用,产生等待事件enq:SQ-contention。其原因是V$SESSION.AUDSID列值是利用序列创建的,Oracle在创建新的会话后,利用名为SYS.AUDSES$的序列的NEXTVAL来创建AUDSID值。Oracle 11g下SYS.AUDSES$的CACHE值默认为10000。
测试3:enq: SV - contention
创建一个CACHE为5的序列,并使用ORDER属性
分别在三个会话执行如下sql
执行asql
在RAC环境下,CACHE+ORDER属性的序列,在多个回话同时调用SEQUENCE.NEXTVAL的时候,会产生enq: SV-contention等待事件,应该尽量设置为NOORDER属性,并扩大其cache值。
3、小结
首先,尽量避免nocache序列的使用;其次,在RAC环境下,为避免SV锁的争用,应该尽量避免使用ORDER 属性,尤其避免ORDER+NOCACHE的组合;最后,在序列使用的并发量较高的情况下,可以尝试增大CACHE值来缓解锁争用,一般可以设定到5000左右。
来自“平台人生”专栏:http://www.talkwithtrend.com/Column/detail/id/11
了解更多--Oracle 相关技能:
■ Oracle11gR2单实例+redhat6.5+virtualBox安装到dbca出现错误,如何解决?
环境变量中的NLS试过
export NLS_LANG=AMERICAN_AMERICA.UTF8
export NLS_LANG='simplified chinese'_china.ZHS16GBK
export ORA_NLS33=$ORACLE_HOME/ocommon/nls/admin/data
注册表也改了,都不行,到底咋回事啊?
[oracle@db11g ~]$ vi .bash_profile
# .bash_profile
# Get the aliases and functions
if [ -f ~/.bashrc ]; then
. ~/.bashrc
fi
# User specific environment and startup programs
PATH=$PATH:$HOME/bin
export ORACLE_BASE=/u01/app/oracle
export ORACLE_HOME=$ORACLE_BASE/product/11.2.0/db_1
export ORACLE_UNQNAME=db11g
export ORACLE_SID=db11g
export PATH=$ORACLE_HOME/bin:$ORACLE_HOME/OPatch:$PATH
export NLS_LANG='simplified chinese'_china.ZHS16GBK
#export NLS_LANG=AMERICAN_AMERICA.UTF8
#export NLS_LANG=AMERICAN_AMERICA.ZHS16GBK
export ORA_NLS33=$ORACLE_HOME/ocommon/nls/admin/data
export PATH
社区会员@ baizhaoxian提供的解决方法:
正确设置如下两个环境变量
export NLS_LANG=AMERICAN_AMERICA.AL32UTF8
export ORA_NLS10=/u01/app/oracle/product/11.2.0/dbhome_1/nls/data
更多相关内容,请点击阅读原文
长按二维码关注公众号