zoukankan      html  css  js  c++  java
  • 从dba_hist_sqlstat视图中查找过去时段最占用资源的会话

    从dba_hist_sqlstat视图中查找过去时段最占用资源的会话

    超过阀值的sql语句会在awr中保存一段时间(默认是7天),可以通过dba_hist_sqlstat视图查询。

    1.查询视图dba_hist_sqlstat
    select snap_id, disk_reads_delta reads_delta,
    executions_delta exec_delta, disk_reads_delta /decode
    (executions_delta, 0, 1,executions_delta) rds_exec_ratio,
    sql_id
    from dba_hist_sqlstat
    where disk_reads_delta > 100000
    order by disk_reads_delta desc;

    snap_id reads_delta exec_delta rds_exec_ratio sql_id
    39 511106 1 511106 8h1qaqha580hh
    29 216898 3 72299.33 d5bcqvumxr4y4

    2.根据sql_id,在dba_hist_sqltext中查看相关sql语句
    select command_type,sql_text
    from dba_hist_sqltext
    where sql_id='d5bcqvumxr4y4';

    command_type sql_text
    3 select count(id) from bom

    注:command_type=3表示这是select命令,完整的command_type可以select * from audit_actions;

    3.查看之前命令的执行计划
    select * from table(dbms_xplan.display_awr('8h1qaqha580hh'));

    ========================================================================
    补充几个有用的oracle dba_hist_*查询语句 :
    1.耗cpu最多的10条语句

    select *
    from (select s.sql_id,
    sum(s.cpu_time_delta),
    sum(s.disk_reads_delta),
    count(*)
    from dba_hist_sqlstat s
    group by s.sql_id
    order by sum(s.cpu_time_delta) desc)
    where rownum < 11;

    2.最近7天,指定时间段(8:00-16:00)最消耗cpu的10条语句

    select *
    from (select s.sql_id,
    sum(s.cpu_time_delta),
    sum(s.disk_reads_delta),
    count(*)
    from dba_hist_sqlstat s, dba_hist_snapshot p
    where 1 = 1
    and s.snap_id = p.snap_id
    and extract(hour from p.end_interval_time) between 8 and 16
    and p.end_interval_time between sysdate - 7 and sysdate
    group by s.sql_id
    order by sum(s.cpu_time_delta) desc)
    where rownum < 11;

    3.可以进一步关联dba_hist_sqltext视图得到详细的sql语句

    select * from
    (select
    s.sql_id, s.sql_text
    sum(s.cpu_time_delta),
    sum(s.disk_reads_delta),
    count(*)
    from dba_hist_sqlstat s, dba_hist_snapshot p, dba_hist_sqltext t
    where 1=1
    and s.snap_id = p.snap_id
    and s.sql_id = t.sql_id
    and extract(hour from p.end_interval_time) between 8 and 16
    and t.command_type != 47 ╟- exclude pl/sql blocks from output
    and p.end_interval_time between sysdate-7 and sysdate
    group by s.sql_id
    order by sum(s.cpu_time_delta) desc
    )
    where rownum < 11

    4.分析指定sql语句各版本执行计划的资源消耗情况

    select st.sql_id,
    st.plan_hash_value,
    sum(st.executions_delta) executions,
    sum(st.rows_processed_delta) crows,
    trunc(sum(st.cpu_time_delta) / 1000000 / 60) cpu_mins,
    trunc(sum(st.elapsed_time_delta) / 1000000 / 60) ela_mins
    from dba_hist_sqlstat st
    where st.sql_id in (‘ &1′)
    group by st.sql_id, st.plan_hash_value
    order by st.sql_id, cpu_mins;

    5.分析对比sql语句在不同执行计划中的执行情况

    select st2.sql_id,
    st2.plan_hash_value,
    st_long.plan_hash_value l_plan_hash_value,
    st2.cpu_mins,
    st_long.cpu_mins l_cpu_mins,
    st2.ela_mins,
    st_long.ela_mins l_ela_mins,
    st2.executions,
    st_long.executions l_executions,
    st2.crows,
    st_long.crows l_crows,
    st2.cpu_mins_per_row,
    st_long.cpu_mins_per_row l_cpu_mins_per_row
    from (select st.sql_id,
    st.plan_hash_value,
    sum(st.executions_delta) executions,
    sum(st.rows_processed_delta) crows,
    trunc(sum(st.cpu_time_delta) / 1000000 / 60) cpu_mins,
    decode(sum(st.rows_processed_delta),
    0,
    0,
    (sum(st.cpu_time_delta) / 1000000 / 60) /
    sum(st.rows_processed_delta)) cpu_mins_per_row,
    trunc(sum(st.elapsed_time_delta) / 1000000 / 60) ela_mins
    from dba_hist_sqlstat st
    where 1 = 1
    and (st.cpu_time_delta != 0 or st.rows_processed_delta != 0)
    group by st.sql_id, st.plan_hash_value) st2,
    (select st.sql_id,
    st.plan_hash_value,
    sum(st.executions_delta) executions,
    sum(st.rows_processed_delta) crows,
    trunc(sum(st.cpu_time_delta) / 1000000 / 60) cpu_mins,
    decode(sum(st.rows_processed_delta),
    0,
    0,
    (sum(st.cpu_time_delta) / 1000000 / 60) /
    sum(st.rows_processed_delta)) cpu_mins_per_row,
    trunc(sum(st.elapsed_time_delta) / 1000000 / 60) ela_mins
    from dba_hist_sqlstat st
    where 1 = 1
    and (st.cpu_time_delta != 0 or st.rows_processed_delta != 0)
    having trunc(sum(st.cpu_time_delta) / 1000000 / 60) > 10
    group by st.sql_id, st.plan_hash_value) st_long
    where 1 = 1
    and st2.sql_id = st_long.sql_id
    and st_long.cpu_mins_per_row /
    decode(st2.cpu_mins_per_row, 0, 1, st2.cpu_mins_per_row) > 2
    order by l_cpu_mins desc,
    st2.sql_id,
    st_long.cpu_mins desc,
    st2.plan_hash_value;

  • 相关阅读:
    使用eclipse阅读java源码
    找重复值
    mysql获取表中数据行数
    DBArtist之Oracle入门第2步: 了解Oracle的Database Control
    DBArtist之Oracle入门第1步: 如何安装Oracle 11g
    存储过程中使用事务和try catch
    Mysql设置auto_increment_increment和auto_increment_offset
    SQL SERVER性能优化综述
    Sql Server 2008R2 数据库发布与订阅
    无法修改SQL Server 服务名称
  • 原文地址:https://www.cnblogs.com/lipeng20004/p/14641409.html
Copyright © 2011-2022 走看看