我需要一个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 |
1条答案
按热度按时间cmssoen21#
最简单的方法是生成一个AWR报告。通过sqlplus本地登录:
字符串
如果您希望手动查询和删除系统查询,您应该切换到使用
gv$sqlarea
并过滤掉那些由SYS
解析的游标(尽管其中一些可能是由DBA及其脚本生成的):型
然而,这样的查询很少有用。
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
),但这只是一个快照。