• 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"

  • 相关阅读:
    基于antlr的表达式解析器
    ANTLR语法层的选项及动作
    Understanding ANTLR Grammar Files
    写给Git初学者的7个建议
    Top 8 Diagrams for Understanding Java
    技术面不深入
    一个初级程序员学习新技术的策略
    SoftReference,WeakReference&WeakHashMap
    探索Antlr(Antlr 3.0更新版)
    Five minute introduction to ANTLR 3
  • 原文地址:https://www.cnblogs.com/binliubiao/p/15536228.html
Copyright © 2020-2023  润新知