ITPub博客

首页 > 数据库 > Oracle > 查找数据库里执行大于2s的语句

查找数据库里执行大于2s的语句

原创 Oracle 作者:hurp_oracle 时间:2014-11-13 15:14:26 0 删除 编辑
使用该过程可以定期查找出数据库里执行大于2s的语句

CREATE OR REPLACE procedure SYS.versiononline_larges2s_sql is
  version_table varchar2(50);
  TEMPCOUNT     NUMBER;
  T_TABLE       VARCHAR2(100) := 'LARGE2S_TABLE02';
  v_sql01         VARCHAR2(2000);
  v_sql02       VARCHAR2(2000);
  v_sql03       VARCHAR2(2000);
BEGIN
  select COUNT(*)
    into TEMPCOUNT
    from dba_tables
   where table_name = T_TABLE;
  If TEMPCOUNT > 0 Then
    v_sql01 := ' insert into ' || T_TABLE ||
             '  select *
  from (SELECT A.SQL_ID,
               A.sql_fulltext,
               A.FIRST_LOAD_TIME,
               A.ELAPSED_TIME,
               A.ELAPSED_TIME / decode(A.EXECUTIONS, 0, 1, A.EXECUTIONS) EE,
               A.EXECUTIONS,
               B.MACHINE,
               B.PROGRAM,
               A.LAST_ACTIVE_TIME,
               A.FORCE_MATCHING_SIGNATURE,
               A.EXACT_MATCHING_SIGNATURE 
          FROM V$SQL A, V$ACTIVE_SESSION_HISTORY B
         WHERE A.SQL_ID = B.SQL_ID
           and B.machine in (''c4w28'',''tcsm1'')   
           and a.first_load_time between 
                          TO_DATE(''20141105 09 :00 :00'',
                       ''YYYYMMDD HH24 :MI :SS'') AND
               TO_DATE(''20141115 17 :59 :00'',
                       ''YYYYMMDD HH24 :MI :SS'')
           AND A.LAST_ACTIVE_TIME BETWEEN
               TO_DATE(''20141105 09 :00 :00'',
                       ''YYYYMMDD HH24 :MI :SS'') AND
               TO_DATE(''20141115 17 :59 :00'',
                       ''YYYYMMDD HH24 :MI :SS'')
           AND B.PROGRAM NOT LIKE ''sqlplus%''
           and B.PROGRAM NOT LIKE ''plsqlde%''
           AND B.PROGRAM NOT LIKE ''oracle@%''
           and A.SQL_ID NOT IN (SELECT SQL_ID
                                  FROM ' ||
             T_TABLE || ')
         order by EE DESC)
 WHERE EE > 2000000 ';
    EXECUTE IMMEDIATE v_sql01;
    dbms_output.put_line(v_sql01);
    COMMIT;
 v_sql02:='delete sys.'||T_TABLE||' a where rowid<(select max(rowid) from sys.'||T_TABLE||' b where a.sql_id=b.sql_id)';
 v_sql03:='delete sys.'||T_TABLE||' a where FORCE_MATCHING_SIGNATURE != EXACT_MATCHING_SIGNATURE';    
    EXECUTE IMMEDIATE v_sql02;
    commit;
    EXECUTE IMMEDIATE v_sql03;
    COMMIT;    
  else
    execute immediate 'create table sys.'||T_TABLE||' (sql_id VARCHAR2(13),sql_fulltext CLOB,first_load_time VARCHAR2(38),elapsed_time number,
ee number,executions number,machine VARCHAR2(64),program VARCHAR2(48),last_active_time DATE,FORCE_MATCHING_SIGNATURE number,EXACT_MATCHING_SIGNATURE number) tablespace users';
    v_sql01 := ' insert into ' || T_TABLE ||
             ' select *
  from (SELECT A.SQL_ID,
               A.sql_fulltext,
               A.FIRST_LOAD_TIME,
               A.ELAPSED_TIME,
               A.ELAPSED_TIME / decode(A.EXECUTIONS, 0, 1, A.EXECUTIONS) EE,
               A.EXECUTIONS,
               B.MACHINE,
               B.PROGRAM,
               A.LAST_ACTIVE_TIME,
               A.FORCE_MATCHING_SIGNATURE,
               A.EXACT_MATCHING_SIGNATURE 
          FROM V$SQL A, V$ACTIVE_SESSION_HISTORY B
         WHERE A.SQL_ID = B.SQL_ID
               and B.machine in (''c4w28'',''tcsm1'') 
               AND A.FIRST_LOAD_TIME BETWEEN 
                          TO_DATE(''20141105 09 :00 :00'',
                       ''YYYYMMDD HH24 :MI :SS'') AND
               TO_DATE(''20141115 17 :59 :00'',
                       ''YYYYMMDD HH24 :MI :SS'')
           AND A.LAST_ACTIVE_TIME BETWEEN
               TO_DATE(''20141105 09:00:00'',
                       ''YYYYMMDD HH24:MI:SS'') AND
               TO_DATE(''20141115 17 :59 :00'',
                       ''YYYYMMDD HH24 :MI :SS'')
           AND B.PROGRAM NOT LIKE ''sqlplus%'' 
           and B.PROGRAM NOT LIKE ''plsqlde%''
           AND B.PROGRAM NOT LIKE ''oracle@%''  and A.SQL_ID NOT IN (SELECT SQL_ID
                                  FROM ' ||
             T_TABLE || ')
         order by EE DESC)
 WHERE EE > 2000000';
    EXECUTE IMMEDIATE v_sql01;
    COMMIT;
 v_sql02:='delete sys.'||T_TABLE||' a where rowid<(select max(rowid) from sys.'||T_TABLE||' b where a.sql_id=b.sql_id)';
 v_sql03:='delete sys.'||T_TABLE||' a where FORCE_MATCHING_SIGNATURE != EXACT_MATCHING_SIGNATURE';    
    EXECUTE IMMEDIATE v_sql02;
    commit;
    EXECUTE IMMEDIATE v_sql03;
    COMMIT;
  end if;
end versiononline_larges2s_sql;
/

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/29446986/viewspace-1331273/ ,如需转载,请注明出处,否则将追究法律责任。

上一篇: awk
请登录后发表评论 登录
全部评论

注册时间:2014-01-17

  • 博文量
    152
  • 访问量
    647363