热门查询10 Rac Oracle

bq3bfh9z  于 2023-11-17  发布在  Oracle
关注(0)|答案(1)|浏览(106)

我需要一个SQL查询,它将允许我根据CPU执行时间和查询所有节点的Oracle RAC(真实的应用程序集群)上的执行次数检索前10名。伊朗此查询,但它只返回系统查询。但是,我需要用户查询:

SET SERVEROUTPUT ON
SET LINESIZE 200
SET PAGESIZE 1000
SET FEEDBACK OFF

-- Top 10 des requêtes basé sur la durée d'exécution
DECLARE
  CURSOR query_cursor IS
    SELECT
      ROWNUM AS rank,
      v.sql_id,
      SUBSTR(v.sql_text, 1, 120) AS truncated_sql,
      TO_CHAR(v.elapsed_time / 1000000, '999999.9') AS elapsed_seconds,
      v.executions
    FROM (
      SELECT
        sql_id,
        sql_text,
        elapsed_time,
        executions
      FROM
        gv$sqlstats
      ORDER BY
        elapsed_time DESC
    ) v
    WHERE ROWNUM <= 10;

  v_rank NUMBER;
  v_sql_id VARCHAR2(13);
  v_truncated_sql VARCHAR2(120);
  v_elapsed_seconds VARCHAR2(10);
  v_executions NUMBER;
BEGIN
  DBMS_OUTPUT.PUT_LINE('Rank| SQL_ID    |                                        Truncated SQL                                                                    | Elapsed(S)| NbExec');
  DBMS_OUTPUT.PUT_LINE('--|-------------|-------------------------------------------------------------------------------------------------------------------------|-----------|--------|');

  FOR result IN query_cursor LOOP
    v_rank := result.rank;
    v_sql_id := result.sql_id;
    v_truncated_sql := result.truncated_sql;
    v_elapsed_seconds := result.elapsed_seconds;
    v_executions := result.executions;
    DBMS_OUTPUT.PUT_LINE(
      RPAD(TO_CHAR(v_rank),2) || '|' ||
      RPAD(v_sql_id, 13) || '|' ||
      RPAD(v_truncated_sql, 121) || '|' ||
      RPAD(v_elapsed_seconds, 10) || ' |' ||
      RPAD(TO_CHAR(v_executions), 5)|| '   |'
    );
  END LOOP;
END;
/

字符串
| 秩|SQL_ID|截断的SQL|经过时间(S)|NbExec|
| --|--|--|--|--|
| 1 |5mw55dp9p6nyt| select nvl(max(al.recid),'0'),nvl(max(al.recid),0)into:txtparmvalue,:parmvalue from v$archived_log al其中|480931.8| 81875 |
| 2 |882k0vh2bdt15|从V$ARCHIVED_MANARAL、V$DATABASE_INCARNATION DB中选择NVL(MAX(AL. NEXT_CHANGE#),0)、NVL(MAX(AL.RESETLOGS_CHANGE#),0)|158288.7| 23165 |
| 3 |6zq7whdtnf2ru| declare agedFileRec dbms_rcvman.agedFileRec_t; first boolean:= 0; allde| 134271.1| 85685 |
| 5 |6hnhqahphpk8n| select free_mb from v$asm_diskgroup_stat where name=:1| 117978.8| 14071 |
| 6 |dqj0vf99v3th5|选择sna.ID、sna.NUMEROSNA、sna.CODECATEGORIESNA、sna.CODETYPESNA、sna.CAMPAGNEDEBUT、sna.CAMPAGNEFIN、sna.SURFACEGR| 111381.5| 18212 |
| 7 |6hnhqahphpk8n| select free_mb from v$asm_diskgroup_stat where name=:1| 109830.5| 13778 |
| 8 |6hnhqahphpk8n| select free_mb from v$asm_diskgroup_stat where name=:1| 109491.1| 13803 |
| 9 |6hnhqahphpk8n| select free_mb from v$asm_diskgroup_stat where name=:1| 100705.2| 13954 |
| 10 |4z0v74h1gc1kq|选择BS.SET_STAMP LIST_ORDER1,0 LIST_ORDER2,BS.RECID PKEY,:B 9文件类型,:B 9文件类型,BS.保持保持,BS.保持_UNT| 88803.0| 4901 |

cmssoen2

cmssoen21#

最简单的方法是生成一个AWR报告。通过sqlplus本地登录:

@?/rdbms/admin/awrrpt.sql

字符串
如果您希望手动查询和删除系统查询,您应该切换到使用gv$sqlarea并过滤掉那些由SYS解析的游标(尽管其中一些可能是由DBA及其脚本生成的):

SELECT *
  FROM (SELECT sql_id,
               MAX(sql_text) sql_text,
               SUM(elapsed_time)/100 elapsed_time,
               SUM(executions) executions
          FROM gv$sqlarea
         WHERE parsing_schema_name != 'SYS'
         GROUP BY sql_id
         ORDER BY elapsed_time DESC)
 WHERE ROWNUM <= 10


然而,这样的查询很少有用。
1.这些视图中的统计信息是自游标加载以来累积的。如果游标由于经常使用而在共享池中停留了许多天,则这些数字可能看起来相当大,但实际上并不代表特定时间段的工作负载的重要部分。最好检查一段时间,AWR报告将执行此操作,或者您可以通过查询dba_hist_sqlstat并使用增量来执行此操作。
1.运行时间也不一定是最有用的统计数据。一个运行1分钟的32个线程的并行查询看起来像是花了半小时的时间,而实际上只使用了1分钟的时钟时间。如果你对应用程序活动运行了多长时间感兴趣,这是一种误导。你不能用它来衡量系统的压力,因为你不知道有多少时间是并发等待(实际上没有使用资源)。
1.前10名的报告可能 * 有时 * 是有用的,但在我的经验中很少如此。一个问题查询可能不会出现在前10名中,原因有很多。同样,仅仅因为某件事在前10名并不意味着它是一个问题。前10名不断变化,这取决于你所关注的时间范围。从历时的Angular 来看要好得多要做到这一点,您可以运行ASH报告或手动查询gv$active_session_history(最近的活动,每秒1行,或dba_hist_active_sess_history,较旧的活动,每10秒1行),考虑到等待事件(event)和跨时间查看。这是最好的图形工具,可以随着时间的推移绘制数据。如果你有OEM,它使用这些数据的图形。帮助不大,但更容易,我们可以生成一个ASH报告(@?/rdbms/admin/ashrpt.sql),但这只是一个快照。

相关问题