zoukankan      html  css  js  c++  java
  • DM定位慢SQL

    通过系统视图定位慢SQL

    DM 数据库提供系统动态视图,可自动记录执行时间超过设定阈值的 SQL 语句。

    配置方式

    当 INI 参数 ENABLE_MONITOR=1、MONITOR_TIME=1 打开时,显示系统最近 1000 条执行时间超过预定值的 SQL 语句。默认预定值为 1000 毫秒。可通过 SP_SET_LONG_TIME 系统函数修改,通过 SF_GET_LONG_TIME 系统函数查看当前值。

    修改配置

    -- 两个参数均为动态参数,可直接调用系统函数进行修改
    SP_SET_PARA_VALUE(1,'ENABLE_MONITOR',1);
    SP_SET_PARA_VALUE(1,'MONITOR_TIME',1);
    
    -- 记录执行时间超过2000 毫秒的SQL
    SP_SET_LONG_TIME(2000);
    

    查看配置

    select SF_GET_LONG_TIME();
    

    查看慢SQL

    V$LONG_EXEC_SQLS 视图

    超过执行时间阈值的 SQL 语句记录在 V$LONG_EXEC_SQLS 系统视图中

    SELECT * FROM V$LONG_EXEC_SQLS;
    
    V$LONG_EXEC_SQLS 字段说明
    列名 说明
    SESS_ID 会话 ID,会话唯一标识
    SQL_ID 语句 ID,语句唯一标识
    SQL_TEXT SQL 文本
    EXEC_TIME 执行时间(毫秒)
    FINISH_TIME 执行结束时间
    N_RUNS 执行次数
    SEQNO 编号
    TRX_ID 事务号

    查询活动会话数

    SELECT COUNT(*) FROM V$SESSIONS WHERE STATE='ACTIVE';
    

    获取已执行超过 2 秒的活动 SQL

    SELECT* FROM (
    SELECT SESS_ID,SQL_TEXT,DATEDIFF(SS,LAST_RECV_TIME,SYSDATE) Y_EXETIME,
           SF_GET_SESSION_SQL(SESS_ID) FULLSQL,CLNT_IP
    FROM V$SESSIONS WHERE STATE='ACTIVE')
    WHERE Y_EXETIME>=2;
    

    阻塞查询

    WITH LOCKS
         AS (SELECT O.NAME,L.*,S.SESS_ID,S.SQL_TEXT,S.CLNT_IP,S.LAST_SEND_TIME
               FROM V$LOCK L, SYSOBJECTS O, V$SESSIONS S
              WHERE L.TABLE_ID = O.ID AND L.TRX_ID = S.TRX_ID),
         LOCK_TR
         AS (SELECT TRX_ID WT_TRXID, TID BLK_TRXID
               FROM LOCKS
              WHERE BLOCKED = 1),
         RES
         AS (SELECT SYSDATE STATTIME,T1.NAME,T1.SESS_ID WT_SESSID,S.WT_TRXID,
                    T2.SESS_ID BLK_SESSID,S.BLK_TRXID,T2.CLNT_IP,
                    SF_GET_SESSION_SQL (T1.SESS_ID) FULSQL,
                    DATEDIFF (SS, T1.LAST_SEND_TIME, SYSDATE) SS,
                    T1.SQL_TEXT WT_SQL
               FROM LOCK_TR S, LOCKS T1, LOCKS T2
              WHERE     T1.LTYPE = 'OBJECT'
                    AND T1.TABLE_ID <> 0
                    AND T2.LTYPE = 'OBJECT'
                    AND T2.TABLE_ID <> 0
                    AND S.WT_TRXID = T1.TRX_ID
                    AND S.BLK_TRXID = T2.TRX_ID)
    SELECT DISTINCT WT_SQL,CLNT_IP,SS,WT_TRXID,BLK_TRXID
      FROM RES;
    

    查询等待事务

    -- 1. 确认语句处于活动状态
    SELECT * FROM v$sessions WHERE state='ACTIVE'
    AND dbms_lob.substr(sf_get_session_sql(sess_id)) LIKE '%语句片段%'
    
    -- 2. 
    SELECT * FROM v$trxwait WHERE id = <上述语句得到结果得 TRX_ID>
    

    V$TRXWAIT 查询得到结果的 WAIT_FOR_ID 字段标记的事务即为当前语句正在等待的事务

    通过开始SQL跟踪日志定位慢查询

    详见"实施-> 7-DM 开启SQL日志跟踪分析.md"

  • 相关阅读:
    中海洋朗讯杯比赛总结[2014年12月]
    青理工ACM比赛总结和反思[2014年11月]
    程序员技术练级攻略
    一天能学会的计算机技术
    UVa 1597
    回滚机制
    超时和重试机制
    降级特技
    限流详解
    隔离术
  • 原文地址:https://www.cnblogs.com/binliubiao/p/15536228.html
Copyright © 2011-2022 走看看