【等待事件】序列等待事件总结(enq: SQ - contention、row cache lock、DFS lock handle和enq: SV - contention)
【等待事件】序列等待事件总结(enq: SQ - contention、row cache lock、DFS lock handle和enq: SV - contention)
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(http://blog.itpub.net/26736162)、博客园(http://www.cnblogs.com/lhrbest)和微信公众号(xiaomaimiaolhr)上有同步更新。
② 文章中用到的所有代码、相关软件、相关资料及本文的pdf版本都请前往小麦苗的云盘下载,小麦苗的云盘地址见:http://blog.itpub.net/26736162/viewspace-1624453/。
③ 若网页文章代码格式有错乱,请下载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 相关文章链接
有关队列的更多介绍可以参考:http://blog.itpub.net/26736162/viewspace-2126079/
【故障处理】序列cache值过小导致CPU利用率过高”,连接地址为:http://blog.itpub.net/26736162/viewspace-2123996/
|
2016-10-18 |
【等待事件】等待事件系列(5.1)--Enqueue(队列等待)--5.1.6 enq: SQ - contention 序列 |
http://mp.weixin.qq.com/s?__biz=MzIzOTA2NjEzNQ==&mid=2454771602&idx=1&sn=3112cd29b4877435ffe37b603b263d00&chksm=fe8bbaeac9fc33fc6b0df4efa6e923f7c4f7ba2830659b75934627bf079dc76842bfc2b6f976&scene=21#wechat_redirect |
|
2016-08-24 |
||
|
2016-10-14 |
||
|
2016-10-11 |
||
|
等待事件系列 |
||
|
http://blog.itpub.net/26736162/viewspace-2124771/ |
||
|
http://blog.itpub.net/26736162/viewspace-2124767/ |
||
|
http://blog.itpub.net/26736162/viewspace-2124735/ |
||
|
http://blog.itpub.net/26736162/viewspace-2124435/ |
||
|
http://blog.itpub.net/26736162/viewspace-2124417/ |
||
|
http://blog.itpub.net/26736162/viewspace-2124369/ |
||
|
http://blog.itpub.net/26736162/viewspace-2126079/ |
||
|
http://blog.itpub.net/26736162/viewspace-2125065/ |
||
|
http://blog.itpub.net/26736162/viewspace-2124435/ |
||
|
http://blog.itpub.net/26736162/viewspace-2124417/ |
||
|
http://blog.itpub.net/26736162/viewspace-2124771/ |
||
|
http://blog.itpub.net/26736162/viewspace-2124767/ |
||
|
http://blog.itpub.net/26736162/viewspace-2124735/ |
||
|
http://blog.itpub.net/26736162/viewspace-2124369/ |
||
|
http://blog.itpub.net/26736162/viewspace-2123996/ |
2.3 本文简介
在2016年8月24日发布过一篇文章,BLOG名称为:“【故障处理】序列cache值过小导致CPU利用率过高”,连接地址为:http://blog.itpub.net/26736162/viewspace-2123996/,文章中根据案例详细分析了一次有关enq: SQ - contention等待事件的问题,基本上把所有的有关序列问题导致的等待事件全部讲解了一遍,但是那篇文章是针对Oracle 10g数据库而言的,而在Oracle 11g中,对SV锁进行了分离,出现了enq: SV - contention等待事件,而在Oracle 10g不存在“enq: SV - contention”该等待事件,而是表现为DFS lock handle,所以这篇文章将再次把序列等待事件整理一下。
第二章 序列等待事件
1 基础知识介绍
序列的等待事件基本上都与队列的等待事件相关,有关队列的更多介绍可以参考:http://blog.itpub.net/26736162/viewspace-2126079/
其实,“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测试,单实例数据库单会话循环不间断取个值。
|
类别 |
用时 |
|
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
NOCACHE ;
开2-3个窗口分别执行如下的SQL语句:
DECLARE
V_N NUMBER;
BEGIN
.. 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';

;

,,) 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;
NOORDER;
DECLARE
V_N NUMBER;
BEGIN
.. 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,
) / ) ||
) / ) "Lock",
) "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;
ORDER;
DECLARE
V_N NUMBER;
BEGIN
.. 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,
) / ) ||
) / ) "Lock",
) "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.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 序列等待案例处理参考
有关队列的更多介绍可以参考:http://blog.itpub.net/26736162/viewspace-2126079/
【故障处理】序列cache值过小导致CPU利用率过高”,连接地址为:http://blog.itpub.net/26736162/viewspace-2123996/
|
2016-08-24 |
About Me
|
............................................................................................................................... ● 本文作者:小麦苗,只专注于数据库的技术,更注重技术的运用 ● 本文在itpub(http://blog.itpub.net/26736162)、博客园(http://www.cnblogs.com/lhrbest)和个人微信公众号(xiaomaimiaolhr)上有同步更新 ● 本文itpub地址:http://blog.itpub.net/26736162/viewspace-2127465/ ● 本文博客园地址:http://www.cnblogs.com/lhrbest/p/6020872.html ● 本文pdf版及小麦苗云盘地址:http://blog.itpub.net/26736162/viewspace-1624453/ 微信群:私聊 ● 联系我请加QQ好友(642808185),注明添加缘由 -31 12:00 ~ 2016-11-01 19:00 在中行完成 ● 文章内容来源于小麦苗的学习笔记,部分整理自网络,若有侵权或不当之处还请谅解 ● 版权所有,欢迎分享本文,转载请保留出处 ............................................................................................................................... 手机长按下图识别二维码或微信客户端扫描下边的二维码来关注小麦苗的微信公众号:xiaomaimiaolhr,免费学习最实用的数据库技术。
|
【等待事件】序列等待事件总结(enq: SQ - contention、row cache lock、DFS lock handle和enq: SV - contention)的更多相关文章
- 【等待事件】等待事件系列(5.1)--Enqueue(队列等待)
[等待事件]等待事件系列(5.1)--Enqueue(队列等待) 1 BLOG文档结构图 2 前言部分 2.1 导读和注意事项 各位技术爱好者,看完本文后,你可以掌握如下的技能,也可 ...
- Oracle等待事件之等待事件详解
一. 等待事件的相关知识:1.1 等待事件主要可以分为两类:即空闲(IDLE)等待事件和非空闲(NON-IDLE)等待事件.1). 空闲等待事件指ORACLE正等待某种工作,在诊断和优化数据库的时候, ...
- 【等待事件】等待事件系列(3+4)--System IO(控制文件)+日志类等待
[等待事件]等待事件系列(3+4)--System IO(控制文件)+日志类等待 1 BLOG文档结构图 2 前言部分 2.1 导读和注意事项 各位技术爱好者,看完本文后,你可 ...
- C#多线程同步事件及等待句柄AutoResetEvent 和 ManualResetEvent
最近捣鼓了一下多线程的同步问题,发现其实C#关于多线程同步事件处理还是很灵活,这里主要写一下,自己测试的一些代码,涉及到了AutoResetEvent 和 ManualResetEvent,当然还有也 ...
- C# 多线程(lock,Monitor,Mutex,同步事件和等待句柄)
本篇从 Monitor,Mutex,ManualResetEvent,AutoResetEvent,WaitHandler 的类关系图开始,希望通过本篇的介绍能对常见的线程同步方法有一个整体的认识,而 ...
- 【转】多线程:C#线程同步lock,Monitor,Mutex,同步事件和等待句柄(上)
本篇从Monitor,Mutex,ManualResetEvent,AutoResetEvent,WaitHandler的类关系图开始,希望通过 本篇的介绍能对常见的线程同步方法有一个整体的认识,而对 ...
- enq: SQ - contention
--每分钟操作 SQL> select sql_id, mi, count(mi) 2 from (select event, sql_id, to_char(sample_time ...
- HTML 事件(三) 事件流与事件委托
本篇主要介绍HTML DOM中的事件流和事件委托. 其他事件文章 1. HTML 事件(一) 事件的介绍 2. HTML 事件(二) 事件的注册与注销 3. HTML 事件(三) 事件流与事件委托 4 ...
- onload事件与ready事件的区别,原生js与jquery的区别
onload事件与ready事件分别是原生js与jquery的入口函数 原生js入口函数写法: window.onload=function(){ } jquery入口函数写法: $(document ...
随机推荐
- Angular系列----AngularJS入门教程05:双向绑定(转载)
在这一步你会增加一个让用户控制手机列表显示顺序的特性.动态排序可以这样实现,添加一个新的模型属性,把它和迭代器集成起来,然后让数据绑定完成剩下的事情. 请重置工作目录: git checkout -f ...
- 订餐APP第二次sprint+燃尽图
MY-HR 成员: 角色分配 学号 博客园 团队贡献分 围观其他小组评论 丘惠敏 PM项目经理 201406114203 http://www.cnblogs.com/qiuhuimin/ 21 ht ...
- 第二sprint总结
总结:在第二轮sprint中,团队的开发工作出现了极大的懈怠,团队成员分配的工作完成情况较差,进度较慢,希望能在最后一周中,完成预定的功能模块 个人贡献分: 124陈彦生:22=20*5*22% 14 ...
- ok6410 android driver(9)
In this essay, I will write the JNI to test our leds device. If you don't know how to create a jni p ...
- 有关CLR的初学小整理2(可能理解不深刻,望大牛指出)
针对原文有用的段落,写一写自己的理解,注释: 1. 托管exe文件被启动的时候,首先被PE Loader载入.PE Loader载入exe文件之后,会分析PE文件头的data directory ta ...
- ActiveReports 报表应用教程 (5)---解密电子商务领域首张电子发票的诞生(套打报表)
6月27日京东商城发布了中国电子商务领域首张电子发票,同时宣布相关系统正式上线,这标志着中国电子商务的步伐又向前迈出了重要的一步.目前“电子发票”覆盖的服务范围是在北京地区购买图书.音像商品的个人消费 ...
- mysql select语句解析
select语句用于从一个或多个数据表选出特定行.特定列的交集 最简单的select语句的语法格式如下: select column1,column2 ........ (列) from 数 ...
- HDU 1028(母函数)
Online Judge Online Exercise Online Teaching Online Contests Exercise Author F.A.QHand In HandOnline ...
- Linux chmod命令详解
Linux chmod命令详解 chmod----改变一个或多个文件的存取模式(mode) chmod [options] mode files 只能文件属主或特权用户才能使用该功能来改变文件 ...
- linux实现rdp访问
远程访问linux系统,我们常用的有终端ssh.图形界面VNC,但是VNC安全性不够,并且不够流畅.相比之下,我认为rdp更好,并且还能利用windows的远程桌面访问,非常方便. 1. 安装xRDP ...
