• 【等待事件】序列等待事件总结(enq: SQ


    等待事件序列等待事件总结(enq: SQ - contentionrow cache lockDFS lock handleenq: SV -  contention

    1  BLOG文档结构图

    wpsBC4E.tmp 

    2  前言部分

    2.1  导读和注意事项

    各位技术爱好者,看完本文后,你可以掌握如下的技能,也可以学到一些其它你所不知道的知识,~O(∩_∩)O~

    序列等待事件总结

    enq: SQ - contentionrow cache lockDFS lock handleenq: SV -  contention模拟

    序列的CACHE值性能测试

    RAC中序列的ORDERNOORDER测试

    序列等待的相关案例处理

    Tips

    本文在itpubhttp://blog.itpub.net/26736162)、博客园(http://www.cnblogs.com/lhrbest)和微信公众号(xiaomaimiaolhr)上有同步更新

    文章中用到的所有代码、相关软件、相关资料及本文的pdf版本都请前往小麦苗的云盘下载,小麦苗的云盘地址见:http://blog.itpub.net/26736162/viewspace-1624453/

    若网页文章代码格式有错乱,下载pdf格式的文档来阅读

    本篇BLOG中,代码输出部分一般放在一行一列的表格中。其中,需要特别关注的地方我都用灰色背景和粉红色字体来表示,比如在下边的例子中,thread 1的最大归档日志号为33thread 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

    【故障处理】序列cache值过小导致CPU利用率过高

    http://mp.weixin.qq.com/s?__biz=MzIzOTA2NjEzNQ==&mid=2454771414&idx=1&sn=0cbc454bc7d5a513bbca6083958e2f34&scene=21#wechat_redirect

    2016-10-14

    【等待事件】等待事件系列(5.1)--Enqueue(队列等待)--5.1.2 数据字典

    http://mp.weixin.qq.com/s?__biz=MzIzOTA2NjEzNQ==&mid=2454771592&idx=1&sn=2a2b8c842aa95fd05c5de559495f4055&chksm=fe8bbaf0c9fc33e66b5b2dc4b8a0b411837777a202201b89e853bd41a49ed1ee9ec1d74bb22d&scene=21#wechat_redirect

    2016-10-11

    【等待事件】等待事件系列(5.1)--Enqueue(队列等待)--5.1.1 简介部分

    http://mp.weixin.qq.com/s?__biz=MzIzOTA2NjEzNQ==&mid=2454771584&idx=1&sn=037855f956bb297168b3e2282c436e53&chksm=fe8bbaf8c9fc33eebeca20a9c66c18800bd49e5f90059e0df6f1516f456c6de2968f2322d1f6&scene=21#wechat_redirect

    等待事件系列

     

    【故障处理】队列等待之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  本文简介

    2016824日发布过一篇文章,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 - contentionrow cache lockDFS lock handleenq: SV -  contention4个等待事件都与Oracle序列有关,如下所示:

    SELECT *

    FROM V$EVENT_NAME

    WHERE NAME IN ('row cache lock',

    'enq: SQ - contention',

    'DFS lock handle',

    'enq: SV -  contention');

    wpsBC4F.tmp 

    其中,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值如下表所示:

    wpsBC5F.tmp 

    使用如下的SQL可以查询SQSV2种锁的解释:

    SELECT * FROM V$LOCK_TYPE D WHERE D.TYPE IN ('SV','SQ');

    wpsBC60.tmp 

    事实上,Oracle为了管理序列使用了如下表所示的三种锁

    wpsBC61.tmp 

    RAC上创建序列时,在赋予了CACHE属性的状态下,若没有赋予ORDER属性,则各节点将会把不同范围的序列CACHE到内存上。比如,拥有两个节点的RAC环境下,创建CACHE值为100序列时,1号节点使用11002号节点使用101200。若两个节点之间都通过递增方式使用序列,必须赋予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 10gSYS.AUDSES$CACHE值默认20,但在Oracle 11gSYS.AUDSES$CACHE值默认为10000,通过如下的SQL可以查询:

    SELECT * FROM DBA_SEQUENCES D WHERE D.SEQUENCE_NAME ='AUDSES$';

    wpsBC62.tmp 

    2  RAC中的序列的ORDERNOORDER测试

    2.1  测试1NOORDER属性序列

    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已经CACHE20个。

    2.2  测试2ORDER属性序列

    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';

    wpsBC63.tmp 

    SELECT * FROM V$ROWCACHE A WHERE A.CACHE#=13;

    wpsBC64.tmp 

    SELECT * FROM v$lock a WHERE a.sid IN (6,8,114) AND a.TYPE <>'AE';

    wpsBC65.tmp 

    SELECT * FROM V$lock_Type a WHERE A.TYPE='TO';

    wpsBC66.tmp 

     

    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';

    wpsBC67.tmp 

    4.3  enq: SV -  contentionDFS 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;

    wpsBC78.tmp 

    Oracle 10.2.0.5中:

    wpsBC79.tmp 

    注意,Oracle 10g表现为:DFS lock handle,而Oracle 11g中表现为enq: SV -  contention。个人测试版本,10g10.2.0.511g版本为11.2.0.4

    5  序列等待案例处理参考

    有关队列的更多介绍可以参考:http://blog.itpub.net/26736162/viewspace-2126079/

    【故障处理】序列cache值过小导致CPU利用率过高,连接地址为:http://blog.itpub.net/26736162/viewspace-2123996/

    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

    ...............................................................................................................................

    本文作者:小麦苗,只专注于数据库的技术,更注重技术的运用

    本文在itpubhttp://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群:230161599     微信群:私聊

    联系我请加QQ好友(642808185),注明添加缘由

    2016-10-31 12:00 ~ 2016-11-01 19:00 在中行完成

    文章内容来源于小麦苗的学习笔记,部分整理自网络,若有侵权或不当之处还请谅解

    版权所有,欢迎分享本文,转载请保留出处

    ...............................................................................................................................

    手机长按下图识别二维码或微信客户端扫描下边的二维码来关注小麦苗的微信公众号:xiaomaimiaolhr,免费学习最实用的数据库技术。

    wpsBC7A.tmp

     

  • 相关阅读:
    Docker系列三:Docker容器管理
    Docker系列一:Docker基本概念及指令介绍
    MySQL数据库“十宗罪”(十大经典错误案例)
    用数据驱动渠道推广(下:数据篇)
    用数据驱动渠道推广(上:工具篇)
    日留存、周留存、月留存,究竟怎样才能让更多的用户留下来?
    MySQL中的联合索引学习教程
    VC++NMAKE
    一元三次方程求根公式
    一元四次方程求根公式
  • 原文地址:https://www.cnblogs.com/lhrbest/p/6020872.html
Copyright © 2020-2023  润新知