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
文章可以转载,必须以链接形式标明出处。

本文转自 张冲andy 博客园博客,原文链接:http://www.cnblogs.com/andy6/p/5877497.html    ,如需转载请自行联系原作者

相关文章
|
SQL Oracle 关系型数据库
Oracle数据库创建表空间和索引的SQL语法示例
以上SQL语法提供了一种标准方式去组织Oracle数据库内部结构,并且通过合理使用可以显著改善查询速度及整体性能。需要注意,在实际应用过程当中应该根据具体业务需求、系统资源状况以及预期目标去合理规划并调整参数设置以达到最佳效果。
723 8
|
11月前
|
SQL 关系型数据库 MySQL
为什么这些 SQL 语句逻辑相同,性能却差异巨大?
我是小假 期待与你的下一次相遇 ~
427 0
|
SQL 关系型数据库 PostgreSQL
CTE vs 子查询:深入拆解PostgreSQL复杂SQL的隐藏性能差异
本文深入探讨了PostgreSQL中CTE(公共表表达式)与子查询的选择对SQL性能的影响。通过分析两者底层机制,揭示CTE的物化特性及子查询的优化融合优势,并结合多场景案例对比执行效率。最终给出决策指南,帮助开发者根据数据量、引用次数和复杂度选择最优方案,同时提供高级优化技巧和版本演进建议,助力SQL性能调优。
1576 1
|
SQL 关系型数据库 MySQL
如何优化SQL查询以提高数据库性能?
这篇文章以生动的比喻介绍了优化SQL查询的重要性及方法。它首先将未优化的SQL查询比作在自助餐厅贪多嚼不烂的行为,强调了只获取必要数据的必要性。接着,文章详细讲解了四种优化策略:**精简选择**(避免使用`SELECT *`)、**专业筛选**(利用`WHERE`缩小范围)、**高效联接**(索引和限制数据量)以及**使用索引**(加速搜索)。此外,还探讨了如何避免N+1查询问题、使用分页限制结果、理解执行计划以及定期维护数据库健康。通过这些技巧,可以显著提升数据库性能,让查询更高效流畅。
|
SQL Oracle 关系型数据库
解决大小写、保留字与特殊字符问题!Oracle双引号在SQL中的特殊应用
在Oracle数据库开发中,双引号的使用是一个重要但易被忽视的细节。本文全面解析了双引号在SQL中的特殊应用场景,包括解决标识符与保留字冲突、强制保留大小写、支持特殊字符和数字开头标识符等。同时提供了最佳实践建议,帮助开发者规避常见错误,提高代码可维护性和效率。
774 6
|
SQL Oracle 关系型数据库
【YashanDB知识库】共享利用Python脚本解决Oracle的SQL脚本@@用法
【YashanDB知识库】共享利用Python脚本解决Oracle的SQL脚本@@用法
|
SQL Oracle 关系型数据库
【YashanDB知识库】yashandb执行包含带oracle dblink表的sql时性能差
【YashanDB知识库】yashandb执行包含带oracle dblink表的sql时性能差
|
SQL 关系型数据库 OLAP
云原生数据仓库AnalyticDB PostgreSQL同一个SQL可以实现向量索引、全文索引GIN、普通索引BTREE混合查询,简化业务实现逻辑、提升查询性能
本文档介绍了如何在AnalyticDB for PostgreSQL中创建表、向量索引及混合检索的实现步骤。主要内容包括:创建`articles`表并设置向量存储格式,创建ANN向量索引,为表增加`username`和`time`列,建立BTREE索引和GIN全文检索索引,并展示了查询结果。参考文档提供了详细的SQL语句和配置说明。
744 2
|
SQL Oracle 关系型数据库
如何在 Oracle 中配置和使用 SQL Profiles 来优化查询性能?
在 Oracle 数据库中,SQL Profiles 是优化查询性能的工具,通过提供额外统计信息帮助生成更有效的执行计划。配置和使用步骤包括:1. 启用自动 SQL 调优;2. 手动创建 SQL Profile,涉及收集、执行调优任务、查看报告及应用建议;3. 验证效果;4. 使用 `DBA_SQL_PROFILES` 视图管理 Profile。
|
SQL Oracle 关系型数据库
【YashanDB知识库】共享利用Python脚本解决Oracle的SQL脚本@@用法
本文来自YashanDB官网,介绍如何处理Oracle客户端sql*plus中使用@@调用同级目录SQL脚本的场景。崖山数据库23.2.x.100已支持@@用法,但旧版本可通过Python脚本批量重写SQL文件,将@@替换为绝对路径。文章通过Oracle示例展示了具体用法,并提供Python脚本实现自动化处理,最后调整批处理脚本以适配YashanDB运行环境。

推荐镜像

更多