打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
【等待事件】序列等待事件总结(SQ、SV、row cache lock、DFS lock handl...
1  BLOG文档结构图
2  前言部分
2.1  导读和注意事项
各位技术爱好者,看完本文后,你可以掌握如下的技能,也可以学到一些其它你所不知道的知识,~O(∩_∩)O~:
① 序列等待事件总结
② enq: SQ - contention、row cache lock、DFS lock handle和enq: SV -  contention模拟
③ 序列的CACHE值性能测试
④ RAC中序列的ORDER和NOORDER测试
⑤ 序列等待的相关案例处理
Tips:
① 本文在itpub()、博客园()和微信公众号(xiaomaimiaolhr)上有同步更新。
② 文章中用到的所有代码、相关软件、相关资料及本文的pdf版本都请前往小麦苗的云盘下载,小麦苗的云盘地址见:。
③ 若网页文章代码格式有错乱,请下载pdf格式的文档来阅读。
④ 在本篇BLOG中,代码输出部分一般放在一行一列的表格中。其中,需要特别关注的地方我都用灰色背景和粉红色字体来表示,比如在下边的例子中,thread 1的最大归档日志号为33,thread 2的最大归档日志号为43是需要特别关注的地方;而命令一般使用黄色背景和红色字体标注;对代码或代码输出部分的注释一般采用蓝色字体表示。
List of Archived Logs in backup set 11
Thrd Seq     Low SCN    Low Time            Next SCN   Next Time
---- ------- ---------- ------------------- ---------- ---------
1    32      1621589    2015-05-29 11:09:52 1625242    2015-05-29 11:15:48
1    33      1625242    2015-05-29 11:15:48 1625293    2015-05-29 11:15:58
2    42      1613951    2015-05-29 10:41:18 1625245    2015-05-29 11:15:49
2    43      1625245    2015-05-29 11:15:49 1625253    2015-05-29 11:15:53
[ZHLHRDB1:root]:/>lsvg -o
T_XLHRD_APP1_vg
rootvg
[ZHLHRDB1:root]:/>
00:27:22 SQL> alter tablespace idxtbs read write;
====》2097152*512/1024/1024/1024=1G
本文如有错误或不完善的地方请大家多多指正,ITPUB留言或QQ皆可,您的批评指正是我写作的最大动力。
2.2  相关文章链接
有关队列的更多介绍可以参考:
【故障处理】序列cache值过小导致CPU利用率过高”,连接地址为:http://blog.itpub.net/26736162/viewspace-2123996/
等待事件系列
【故障处理】队列等待之TX - allocate ITL entry引起的死锁处理
http://blog.itpub.net/26736162/viewspace-2124771/
【故障处理】队列等待之enq: US - contention案例
http://blog.itpub.net/26736162/viewspace-2124767/
【推荐】 【故障处理】队列等待之TX - allocate ITL entry案例
http://blog.itpub.net/26736162/viewspace-2124735/
【推荐】 等待事件系列(1)--User I/O类型(下)
http://blog.itpub.net/26736162/viewspace-2124435/
【推荐】 等待事件系列(1)--User I/O类型(上)
http://blog.itpub.net/26736162/viewspace-2124417/
【推荐】 【故障处理】队列等待之enq: TX - row lock contention
http://blog.itpub.net/26736162/viewspace-2124369/
【推荐】 【等待事件】等待事件系列(5.1)--Enqueue(队列等待)
http://blog.itpub.net/26736162/viewspace-2126079/
【推荐】 【等待事件】等待事件系列(3+4)--System IO(控制文件)+日志类等待
http://blog.itpub.net/26736162/viewspace-2125065/
【推荐】 等待事件系列(1)--User I/O类型(下)
http://blog.itpub.net/26736162/viewspace-2124435/
【推荐】 等待事件系列(1)--User I/O类型(上)
http://blog.itpub.net/26736162/viewspace-2124417/
【推荐】 【故障处理】队列等待之TX - allocate ITL entry引起的死锁处理
http://blog.itpub.net/26736162/viewspace-2124771/
【推荐】 【故障处理】队列等待之enq: US - contention案例
http://blog.itpub.net/26736162/viewspace-2124767/
【推荐】 【故障处理】队列等待之TX - allocate ITL entry案例
http://blog.itpub.net/26736162/viewspace-2124735/
【推荐】 【故障处理】队列等待之enq: TX - row lock contention
http://blog.itpub.net/26736162/viewspace-2124369/
【推荐】 【故障处理】序列cache值过小导致CPU利用率过高
http://blog.itpub.net/26736162/viewspace-2123996/
2.3  本文简介
在2016年8月24日发布过一篇文章,BLOG名称为:“【故障处理】序列cache值过小导致CPU利用率过高”,连接地址为:,文章中根据案例详细分析了一次有关enq: SQ - contention等待事件的问题,基本上把所有的有关序列问题导致的等待事件全部讲解了一遍,但是那篇文章是针对Oracle 10g数据库而言的,而在Oracle 11g中,对SV锁进行了分离,出现了enq: SV -  contention等待事件,而在Oracle 10g不存在“enq: SV -  contention”该等待事件,而是表现为DFS lock handle,所以这篇文章将再次把序列等待事件整理一下。
第二章 序列等待事件
1  基础知识介绍
序列的等待事件基本上都与队列的等待事件相关,有关队列的更多介绍可以参考:
其实,“enq: SQ - contention”、“row cache lock”、“DFS lock handle”和“enq: SV -  contention”这4个等待事件都与Oracle的序列有关,如下所示:
SELECT *
FROM V$EVENT_NAME
WHERE NAME IN ('row cache lock',
'enq: SQ - contention',
'DFS lock handle',
'enq: SV -  contention');
其中,PAREMETER1的值为“name|mode”或“type|mode”的事件为队列等待。在这类等待事件中,name代表队列的名称,type代表队列的类型,mode代表队列的模式。使用如下的SQL可以查询到锁的名称和请求的mode值:
SELECT CHR(BITAND(P1,-16777216)/16777215)||
CHR(BITAND(P1, 16711680)/65535) 'LOCK',
BITAND(P1, 65535) 'MODE'
FROM V$SESSION_WAIT
WHERE EVENT IN ('enq: SQ - contention',
'DFS lock handle',
'enq: SV -  contention');
其中,MODE值如下表所示:
使用如下的SQL可以查询SQ和SV这2种锁的解释:
SELECT * FROM V$LOCK_TYPE D WHERE D.TYPE IN ('SV','SQ');
事实上,Oracle为了管理序列使用了如下表所示的三种锁:
RAC上创建序列时,在赋予了CACHE属性的状态下,若没有赋予ORDER属性,则各节点将会把不同范围的序列值CACHE到内存上。比如,拥有两个节点的RAC环境下,创建CACHE值为100的序列时,1号节点使用1~100,2号节点使用101~200。若两个节点之间都通过递增方式使用序列,必须赋予ORDER属性。Oracle序列默认是NOORDER,如果设置为ORDER,那么在单实例环境没有影响,在RAC环境中,多实例实际缓存相同的序列,此时在多个实例并发取该序列的时候,会有短暂的资源竞争来在多实例之间进行同步。因次性能相比NOORDER要差,所以RAC环境非必须的情况下不要使用ORDER,尤其要避免NOCACHE ORDER组合。
有一点必须要注意,没有赋予CACHE属性时,不管ORDER属性使用与否或RAC环境与否,一直等待row cache lock 事件。row cache lock是可以在全局范围内使用的锁,单实例环境或多实例环境同样可以发生。如果使用了CACHE,如果此时DB崩溃了,那么序列会从CACHE值之后重新开始,在CACHE中没有使用的序列会被跳过,这样就会导致序列不连续。在创建序列时,CACHE的缺省值设定为较小的20。因此创建并发量多的序列时,CACHE值应该取1000以上的较大值。
另外,若一次性同时创建许多会话时,有时会发生enq: SQ - contention等待事件。其原因是V$SESSION.AUDSID列值是利用序列创建的。Oracle在创建新的会话后,利用名为SYS.AUDSES$的序列的NEXTVAL来创建AUDSID值。在Oracle 10g下SYS.AUDSES$的CACHE值默认20,但在Oracle 11g下SYS.AUDSES$的CACHE值默认为10000,通过如下的SQL可以查询:
SELECT * FROM DBA_SEQUENCES D WHERE D.SEQUENCE_NAME ='AUDSES$';
2  RAC中的序列的ORDER和NOORDER测试
2.1  测试1:NOORDER属性的序列
NODE1:
SQL> CREATE SEQUENCE SEQ_NOORDER_LHR START WITH 1 INCREMENT BY 1 CACHE 20 NOORDER;
SEQUENCE CREATED.
SQL> SELECT SEQ_NOORDER_LHR.NEXTVAL FROM DUAL;
NEXTVAL
----------
1
SQL> /
NEXTVAL
----------
2
SQL> /
NEXTVAL
----------
3
NODE2:
SQL>  SELECT SEQ_NOORDER_LHR.NEXTVAL FROM DUAL;
NEXTVAL
----------
21
SQL> /
NEXTVAL
----------
22
SQL> /
NEXTVAL
----------
23
NODE2上不是从4开始的,是从21开始的,因为NODE1已经CACHE了20个。
2.2  测试2:ORDER属性的序列
NODE1:
SQL> CREATE SEQUENCE SEQ_ORDER_LHR START WITH 1 INCREMENT BY 1 CACHE 20 ORDER;
SEQUENCE CREATED.
SQL> SELECT SEQ_ORDER_LHR.NEXTVAL FROM DUAL;
NEXTVAL
----------
1
SQL> /
NEXTVAL
----------
2
SQL> /
NEXTVAL
----------
3
NODE2:
SQL> SELECT SEQ_ORDER_LHR.NEXTVAL FROM DUAL;
NEXTVAL
----------
4
SQL> /
NEXTVAL
----------
5
SQL> /
NEXTVAL
----------
6
指定ORDER之后,取的序列就是顺序的。
3  序列的CACHE值性能测试
SYS@lhrdb> CREATE SEQUENCE SEQ_NOCACHE_LHR NOCACHE;
Sequence created.
SYS@lhrdb> CREATE SEQUENCE SEQ_CACHE20_LHR  CACHE 20;
Sequence created.
SYS@lhrdb> CREATE SEQUENCE SEQ_CACHE100_LHR  CACHE 100;
Sequence created.
SYS@lhrdb> CREATE SEQUENCE SEQ_CACHE1000_LHR  CACHE 1000;
Sequence created.
SYS@lhrdb> SET TIMING ON;
SYS@lhrdb> DECLARE
2   X NUMBER;
3  BEGIN
4   FOR I IN 1 .. 600000 LOOP
5      SELECT SEQ_NOCACHE_LHR.NEXTVAL INTO X FROM DUAL;
6   END LOOP;
7  END;
8  /
PL/SQL procedure successfully completed.
Elapsed: 00:01:16.16
SYS@lhrdb> DECLARE
2   X NUMBER;
3  BEGIN
4   FOR I IN 1 .. 600000 LOOP
5      SELECT SEQ_CACHE20_LHR.NEXTVAL INTO X FROM DUAL;
6   END LOOP;
7  END;
8  /
PL/SQL procedure successfully completed.
Elapsed: 00:00:17.79
SYS@lhrdb> DECLARE
2   X NUMBER;
3  BEGIN
4   FOR I IN 1 .. 600000 LOOP
5      SELECT SEQ_CACHE100_LHR.NEXTVAL INTO X FROM DUAL;
6   END LOOP;
7  END;
8  /
PL/SQL procedure successfully completed.
Elapsed: 00:00:15.22
SYS@lhrdb> DECLARE
2   X NUMBER;
3  BEGIN
4   FOR I IN 1 .. 600000 LOOP
5      SELECT SEQ_CACHE1000_LHR.NEXTVAL INTO X FROM DUAL;
6   END LOOP;
7  END;
8  /
PL/SQL procedure successfully completed.
Elapsed: 00:00:13.74
SYS@lhrdb>
Oracle 11gR2测试,单实例数据库单会话循环不间断取600000个值。
类别
用时
NOCACHE
00:01:16.16
CACHE 20
00:00:17.79
CACHE 100
00:00:15.22
CACHE 1000
00:00:13.74
基本上cache 大于20的时候性能基本可以接受,nocache的时候性能确实很差。
4  等待事件模拟
4.1  row cache lock序列等待模拟
版本:11.2.0.4
CREATE SEQUENCE LHR_SEQ01 START WITH 1 NOCACHE ;
开2-3个窗口分别执行如下的SQL语句:
DECLARE
V_N NUMBER;
BEGIN
FOR CUR IN 1 .. 100000000 LOOP
SELECT LHR_SEQ01.NEXTVAL INTO V_N FROM DUAL;
END LOOP;
END;
/
可以使用vmstat 1查看CPU的使用率。
SELECT A.SID,
A.BLOCKING_SESSION,
A.SQL_ID,
(SELECT B.SQL_TEXT FROM V$SQLAREA B WHERE B.SQL_ID = A.SQL_ID) SQL_TEXT,
A.P1
FROM V$SESSION A
WHERE A.STATUS = 'ACTIVE'
AND A.EVENT = 'row cache lock';
SELECT * FROM V$ROWCACHE A WHERE A.CACHE#=13;
SELECT * FROM v$lock a WHERE a.sid IN (6,8,114) AND a.TYPE <>'AE';
SELECT * FROM V$lock_Type a WHERE A.TYPE='TO';
4.2  enq: SQ - contention模拟
版本:11.2.0.4
DROP  SEQUENCE LHR_SEQ01;
CREATE SEQUENCE LHR_SEQ01 START WITH 1 CACHE 2  NOORDER;
DECLARE
V_N NUMBER;
BEGIN
FOR CUR IN 1 .. 100000000 LOOP
SELECT LHR_SEQ01.NEXTVAL INTO V_N FROM DUAL;
END LOOP;
END;
/
SELECT A.SID,
A.BLOCKING_SESSION,
A.SQL_ID,
(SELECT B.SQL_TEXT FROM V$SQLAREA B WHERE B.SQL_ID = A.SQL_ID) SQL_TEXT,
CHR(BITAND(P1, -16777216) / 16777215) ||
CHR(BITAND(P1, 16711680) / 65535) 'Lock',
BITAND(P1, 65535) 'Mode',
(SELECT A.OBJECT_NAME || ':' || A.OBJECT_TYPE
FROM DBA_OBJECTS A
WHERE A.OBJECT_ID = A.p2) OBJECT_NAME
FROM V$SESSION A
WHERE A.STATUS = 'ACTIVE'
AND A.EVENT = 'enq: SQ - contention';
4.3  enq: SV -  contention和DFS lock handle模拟
DROP  SEQUENCE LHR_SEQ01;
CREATE SEQUENCE LHR_SEQ01 START WITH 1 CACHE 2   ORDER;
DECLARE
V_N NUMBER;
BEGIN
FOR CUR IN 1 .. 100000000 LOOP
SELECT LHR_SEQ01.NEXTVAL INTO V_N FROM DUAL;
END LOOP;
END;
/
版本:11.2.0.4
SELECT A.INST_ID,
A.SID,
A.BLOCKING_SESSION,
A.SQL_ID,
(SELECT B.SQL_TEXT FROM V$SQLAREA B WHERE B.SQL_ID = A.SQL_ID) SQL_TEXT,
CHR(BITAND(P1, -16777216) / 16777215) ||
CHR(BITAND(P1, 16711680) / 65535) 'Lock',
BITAND(P1, 65535) 'Mode',
(SELECT A.OBJECT_NAME || ':' || A.OBJECT_TYPE
FROM DBA_OBJECTS A
WHERE A.OBJECT_ID = A.P2) OBJECT_NAME,
A.EVENT
FROM GV$SESSION A
WHERE A.STATUS = 'ACTIVE'
--  AND A.EVENT = 'enq: SQ - contention'
AND A.SID IN (225, 99, 193, 194)
AND A.SQL_ID IS NOT NULL;
Oracle 10.2.0.5中:
注意,Oracle 10g表现为:DFS lock handle,而Oracle 11g中表现为enq: SV -  contention。个人测试版本,10g为10.2.0.5,11g版本为11.2.0.4。
5  序列等待案例处理参考
有关队列的更多介绍可以参考:
【故障处理】序列cache值过小导致CPU利用率过高”,连接地址为:
2016-08-24
【故障处理】序列cache值过小导致CPU利用率过高
http://mp.weixin.qq.com/s?__biz=MzIzOTA2NjEzNQ==&mid=2454771414&idx=1&sn=0cbc454bc7d5a513bbca6083958e2f34&scene=21#wechat_redirect
About Me
...............................................................................................................................
● 本文作者:小麦苗,只专注于数据库的技术,更注重技术的运用
...............................................................................................................................
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
不包含INTO的动态SQL不会增加序列值
从不sequential的sequence
不通过删除重建方式重置序列值得简单方式。
informix中的序列sequence
Oracle 游标总结+整理
PostgreSQL如何为主键创建自增序列(Sequences)
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服