• Oracle 性能相关常用脚本(SQL)


    在缺乏的可视化工具来监控数据库性能的情形下,常用的脚本就派上用场了,下面提供几个关于Oracle性能相关的脚本供大家参考。以下脚本均在Oracle 10g测试通过,Oracle 11g可能要做相应调整。

    1、寻找最多BUFFER_GETS开销的SQL 语句

    [sql] view plain copy
     
     print?在CODE上查看代码片派生到我的代码片
    1. --filename: top_sql_by_buffer_gets.sql  
    2. --Identify heavy SQL (Get the SQL with heavy BUFFER_GETS)  
    3. SET LINESIZE 190  
    4. COL sql_text FORMAT a100 WRAP  
    5. SET PAGESIZE 100  
    6.   
    7. SELECT *  
    8.   FROM (  SELECT sql_text,  
    9.                  sql_id,  
    10.                  executions,  
    11.                  disk_reads,  
    12.                  buffer_gets  
    13.             FROM v$sqlarea  
    14.            WHERE DECODE (executions, 0, buffer_gets, buffer_gets / executions) >  
    15.                     (SELECT AVG (DECODE (executions, 0, buffer_gets, buffer_gets / executions))  
    16.                             + STDDEV (DECODE (executions, 0, buffer_gets, buffer_gets / executions))  
    17.                        FROM v$sqlarea)  
    18.                  AND parsing_user_id != 3D  
    19.         ORDER BY 5 DESC) x  /*更正@20140613,原来为order by 4,感谢网友lmalds指正*/  
    20.  WHERE ROWNUM <= 10;  

    2、寻找最多DISK_READS开销的SQL 语句

    [sql] view plain copy
     
     print?在CODE上查看代码片派生到我的代码片
    1. --filename:top_sql_disk_reads.sql  
    2. --Identify heavy SQL (Get the SQL with heavy DISK_READS)  
    3. SET LINESIZE 190  
    4. COL sql_text FORMAT a100 WRAP  
    5. SET PAGESIZE 100  
    6.   
    7. SELECT *  
    8.   FROM (  SELECT sql_text,  
    9.                  sql_id,  
    10.                  executions,  
    11.                  disk_reads,  
    12.                  buffer_gets  
    13.             FROM v$sqlarea  
    14.            WHERE DECODE (executions, 0, disk_reads, disk_reads / executions) >  
    15.                     (SELECT AVG (DECODE (executions, 0, disk_reads, disk_reads / executions))  
    16.                             + STDDEV (DECODE (executions, 0, disk_reads, disk_reads / executions))  
    17.                        FROM v$sqlarea)  
    18.                  AND parsing_user_id != 3D  
    19.         ORDER BY 4 DESC) x  /* 更正@20140613,原来为order by 3,谢谢网友lmalds指正*/  
    20.  WHERE ROWNUM <= 10;  

    3、寻找最近30分钟导致资源过高开销的事件

    [sql] view plain copy
     
     print?在CODE上查看代码片派生到我的代码片
    1. --filename:top_event_in_30_min.sql  
    2. --Last 30 minutes result those resources that are in high demand on your system.  
    3. SET LINESIZE 180  
    4. COL event FORMAT a60  
    5. COL total_wait_time FORMAT 999999999999999999  
    6.   
    7.   SELECT active_session_history.event,  
    8.          SUM (  
    9.             active_session_history.wait_time  
    10.             + active_session_history.time_waited)  
    11.             total_wait_time  
    12.     FROM v$active_session_history active_session_history  
    13.    WHERE active_session_history.sample_time BETWEEN SYSDATE - 60 / 2880  
    14.                                                 AND SYSDATE  
    15.          AND active_session_history.event IS NOT NULL  
    16. GROUP BY active_session_history.event  
    17. ORDER BY 2 DESC;  

    4、查找最近30分钟内等待最多的用户

    [sql] view plain copy
     
     print?在CODE上查看代码片派生到我的代码片
    1. --filename:top_wait_by_user.sql  
    2. --What user is waiting the most?  
    3.   
    4. SET LINESIZE 180  
    5. COL event FORMAT a60  
    6. COL total_wait_time FORMAT 999999999999999999  
    7.   
    8.   SELECT ss.sid,  
    9.          NVL (ss.username, 'oracle') AS username,  
    10.          SUM (ash.wait_time + ash.time_waited) total_wait_time  
    11.     FROM v$active_session_history ash, v$session ss  
    12.    WHERE ash.sample_time BETWEEN SYSDATE - 60 / 2880 AND SYSDATE AND ash.session_id = ss.sid  
    13. GROUP BY ss.sid, ss.username  
    14. ORDER BY 3 DESC;  

    5、查找30分钟消耗最多资源的SQL语句

    [sql] view plain copy
     
     print?在CODE上查看代码片派生到我的代码片
    1. --filename:top_sql_by_wait.sql  
    2. -- What SQL is currently using the most resources?  
    3. SET LINESIZE 180  
    4. COL sql_text FORMAT a90 WRAP  
    5. COL username FORMAT a20 WRAP  
    6. SET PAGESIZE 200  
    7.   
    8. SELECT *  
    9.   FROM (  SELECT sqlarea.sql_text,  
    10.                  dba_users.username,  
    11.                  sqlarea.sql_id,  
    12.                  SUM (active_session_history.wait_time + active_session_history.time_waited)  
    13.                     total_wait_time  
    14.             FROM v$active_session_history active_session_history, v$sqlarea sqlarea, dba_users  
    15.            WHERE     active_session_history.sample_time BETWEEN SYSDATE - 60 / 2880 AND SYSDATE  
    16.                  AND active_session_history.sql_id = sqlarea.sql_id  
    17.                  AND active_session_history.user_id = dba_users.user_id  
    18.         GROUP BY active_session_history.user_id,  
    19.                  sqlarea.sql_text,  
    20.                  sqlarea.sql_id,  
    21.                  dba_users.username  
    22.         ORDER BY 4 DESC) x  
    23.  WHERE ROWNUM <= 11;  

    6、等待最多的对象

    [sql] view plain copy
     
     print?在CODE上查看代码片派生到我的代码片
    1. --filename:top_object_by_wait.sql  
    2. --What object is currently causing the highest resource waits?  
    3. SET LINESIZE 180  
    4. COLUMN OBJECT_NAME FORMAT a30  
    5. COLUMN EVENT FORMAT a30  
    6.   
    7.   SELECT dba_objects.object_name,  
    8.          dba_objects.object_type,  
    9.          active_session_history.event,  
    10.          SUM (active_session_history.wait_time + active_session_history.time_waited) ttl_wait_time  
    11.     FROM v$active_session_history active_session_history, dba_objects  
    12.    WHERE active_session_history.sample_time BETWEEN SYSDATE - 60 / 2880 AND SYSDATE  
    13.          AND active_session_history.current_obj# = dba_objects.object_id  
    14. GROUP BY dba_objects.object_name, dba_objects.object_type, active_session_history.event  
    15. ORDER BY 4 DESC;  

    7、寻找基于指定时间范围内的历史SQL语句

    [sql] view plain copy
     
     print?在CODE上查看代码片派生到我的代码片
    1. --注该查询受到awr快照相关参数的影响  
    2. -- filename:top_sql_in_spec_time.sql  
    3. --Top SQLs Elaps time and CPU time in a given time range..  
    4. --X.ELAPSED_TIME/1000000 => From Micro second to second  
    5. --X.ELAPSED_TIME/1000000/X.EXECUTIONS_DELTA => How many times the sql ran  
    6.   
    7. SET PAUSE ON  
    8. SET PAUSE 'Press Return To Continue'  
    9. SET LINESIZE 180  
    10. COL sql_text FORMAT a80 WRAP  
    11.   
    12.   SELECT sql_text,  
    13.          dhst.sql_id,  
    14.          ROUND (x.elapsed_time / 1000000 / x.executions_delta, 3) elapsed_time_sec,  
    15.          ROUND (x.cpu_time / 1000000 / x.executions_delta, 3) cpu_time_sec,  
    16.          x.elapsed_time,  
    17.          x.cpu_time,  
    18.          executions_delta AS exec_delta  
    19.     FROM dba_hist_sqltext dhst,  
    20.          (  SELECT dhss.sql_id sql_id,  
    21.                    SUM (dhss.cpu_time_delta) cpu_time,  
    22.                    SUM (dhss.elapsed_time_delta) elapsed_time,  
    23.                    CASE SUM (dhss.executions_delta) WHEN 0 THEN 1 ELSE SUM (dhss.executions_delta) END  
    24.                       AS executions_delta  
    25.               FROM dba_hist_sqlstat dhss  
    26.              WHERE dhss.snap_id IN  
    27.                       (SELECT snap_id  
    28.                          FROM dba_hist_snapshot  
    29.                         WHERE begin_interval_time >= TO_DATE ('&input_start_date', 'YYYYMMDD HH24:MI')  
    30.                               AND end_interval_time <= TO_DATE ('&input_end_date', 'YYYYMMDD HH24:MI'))  
    31.           GROUP BY dhss.sql_id) x  
    32.    WHERE x.sql_id = dhst.sql_id  
    33. ORDER BY elapsed_time_sec DESC;  

    8、寻找基于指定时间范围内及指定用户的历史SQL语句

    [sql] view plain copy
     
     print?在CODE上查看代码片派生到我的代码片
    1. --注该查询受到awr快照相关参数的影响  
    2. --Author : Robinson  
    3. --Blog   : http://blog.csdn.net/robinson_0612  
    4.   
    5. SELECT DBMS_LOB.SUBSTR (sql_text, 4000, 1) AS sql,  
    6.          ROUND (x.elapsed_time / 1000000, 2) elapsed_time_sec,  
    7.          ROUND (x.cpu_time / 1000000, 2) cpu_time_sec,  
    8.          x.executions_delta AS exec_num,  
    9.          ROUND ( (x.elapsed_time / 1000000) / x.executions_delta, 2) AS exec_time_per_query_sec  
    10.     FROM dba_hist_sqltext dhst,  
    11.          (  SELECT dhss.sql_id sql_id,  
    12.                    SUM (dhss.cpu_time_delta) cpu_time,  
    13.                    SUM (dhss.elapsed_time_delta) elapsed_time,  
    14.                    CASE SUM (dhss.executions_delta) WHEN 0 THEN 1 ELSE SUM (dhss.executions_delta) END  
    15.                       AS executions_delta  
    16.               --DHSS.EXECUTIONS_DELTA = No of queries execution (per hour)  
    17.               FROM dba_hist_sqlstat dhss  
    18.              WHERE dhss.snap_id IN  
    19.                       (SELECT snap_id  
    20.                          FROM dba_hist_snapshot  
    21.                         WHERE begin_interval_time >= TO_DATE ('&input_start_date', 'YYYYMMDD HH24:MI')  
    22.                               AND end_interval_time <= TO_DATE ('&input_end_date', 'YYYYMMDD HH24:MI'))  
    23.                    AND dhss.parsing_schema_name LIKE UPPER ('%&input_username%')  
    24.           GROUP BY dhss.sql_id) x  
    25.    WHERE x.sql_id = dhst.sql_id  
    26. ORDER BY elapsed_time_sec DESC;  

    9、SQL语句被执行的次数

    [sql] view plain copy
     
     print?在CODE上查看代码片派生到我的代码片
    1. --exe_delta表明在指定时间内增长的次数  
    2. -- filename: sql_exec_num.sql  
    3. -- How many Times a query executed?  
    4. SET LINESIZE 180  
    5. SET VERIFY OFF  
    6.   
    7.   SELECT TO_CHAR (s.begin_interval_time, 'yyyymmdd hh24:mi:ss'),  
    8.          sql.sql_id AS sql_id,  
    9.          sql.executions_delta AS exe_delta,  
    10.          sql.executions_total  
    11.     FROM dba_hist_sqlstat sql, dba_hist_snapshot s  
    12.    WHERE     sql_id = '&input_sql_id'  
    13.          AND s.snap_id = sql.snap_id  
    14.          AND s.begin_interval_time > TO_DATE ('&input_start_date', 'YYYYMMDD HH24:MI')  
    15.          AND s.begin_interval_time < TO_DATE ('&input_end_date', 'YYYYMMDD HH24:MI')  
    16. ORDER BY s.begin_interval_time;  
    17. 转:http://blog.csdn.net/leshami/article/details/8904804
  • 相关阅读:
    php 后端跨域请求
    IIS服务器文件跨域问题(几乎可以解决大多数跨域问题)
    JavaScript中的execCommand
    [原创] 利用前端+php批量生成html文件,传入新文本,输出新的html文件
    javascript 生成 uuid
    zabbix安装 检测环境 PHP bcmath off
    mysql中间件-amoeba
    MySQL备份
    ELK日志分析
    SAMBA配置文件详解
  • 原文地址:https://www.cnblogs.com/andy6/p/5877497.html
Copyright © 2020-2023  润新知