【Oracle脚本】查找Oracle高消耗语句

在运行下面的脚本之前需要先用生成AWR报告的SQL(程序脚本一般保存在$ORACLE_HOME下的rdbms/admin中,名称为awrrpt.sql,需要输入生成AWR报告的天数范围)找到开始和结束的snapshot编号:begin_snap和end_snap。

set line 1000
set linesize 200
set pagesize 2000
set long 999999
set echo on
set markup html on
select res.*
  from (select          to_char(d.end_interval_time,‘yyyy-mm-dd‘),
                        a.PARSING_SCHEMA_NAME,
                        c.MODULE,
                        a.sql_id,
                        a.execs as 执行次数,
                        ROUND(a.cpu_times / a.execs, 2) as 单次执行时间,
                        a.cpu_times as cpu消耗时间,
                        ROUND(a.cpu_times / b.sum_time * 100, 2) as 消耗cpu百分比,
                        a.buffer_gets as 逻辑读,
                        ROUND(a.buffer_gets / b.sum_buffer * 100, 2) as 逻辑读百分比,
                        a.disk_read as 物理读,
                        ROUND(a.disk_read / b.sum_disk * 100, 2) as 物理读百分比,
                        c.sql_fulltext
          from (select PARSING_SCHEMA_NAME,
                       sql_id,
                       sum(EXECUTIONS_DELTA) AS execs,
                       round(sum(CPU_TIME_DELTA) / 1000000, 2) AS cpu_times,
                       round(sum(ELAPSED_TIME_DELTA) / 1000000, 2) AS elapsed_time,
                       sum(BUFFER_GETS_DELTA) AS buffer_gets,
                       sum(DISK_READS_DELTA) AS disk_read
                  from sys.WRH$_SQLSTAT wr, gv$instance i
                 where SNAP_ID <= &end_snap
                   and snap_id >= &begin_snap
                   and wr.INSTANCE_NUMBER = i.INSTANCE_NUMBER
                   and i.instance_number = &instance_number
                 group by PARSING_SCHEMA_NAME, wr.INSTANCE_NUMBER, sql_id) a,
               (SELECT round(SUM(CPU_TIME_DELTA) / 1000000, 2) sum_time,
                       SUM(BUFFER_GETS_DELTA) sum_buffer,
                       sum(DISK_READS_DELTA) sum_disk
                  FROM sys.WRH$_SQLSTAT wr, gv$instance i
                 where SNAP_ID <= &end_snap
                   and snap_id >= &begin_snap
                   and wr.INSTANCE_NUMBER = i.INSTANCE_NUMBER
                   and i.instance_number = &instance_number) b,
               v$sqlarea c,
               dba_hist_snapshot d
         where a.execs > 0
           and a.sql_id = c.sql_id
           and a.PARSING_SCHEMA_NAME <> ‘SYS‘
           and d.snap_id = &end_snap
         order by cpu消耗时间 desc) res
         where rownum < 41;

将脚本输出内容保存到记事本txt中,并将记事本的后缀名更改为.html,这样就可以输出以下的网页内容:

时间: 2024-09-30 10:53:07

【Oracle脚本】查找Oracle高消耗语句的相关文章

【Oracle脚本】Oracle进程相关的SQL脚本

1. 求当前会话的SID,SERIAL# select sid, serial# from v$session where audsid = sys_context('userenv', 'sessionid'); 2. 查询session的OS进程ID select p.spid "os thread", b.name "name-user", s.program, s.sid, s.serial#,s.osuser, s.machine from v$proce

ORACLE将执行过的SQL语句存放在内存的共享池

Oracle SQL性能优化深入浅出 ORACLE将执行过的SQL语句存放在内存的共享池(shared buffer pool)中,可以被所有的数据库用户共享.当你执行一个SQL语句(有时被称为一个游标)时,如果它和之前的执行过的语句完全相同,ORACLE就能很快获得已经被解析的语句以及最好的执行路径. 这个功能大大地提高了SQL的执行性能并节省了内存的使用. 为了不重复解析相同的SQL语句,在第一次解析之后,Oracle将SQL语句存放在内存中.这块位于系统全局区域SGA(systemglob

Oracle和SQL SERVER在SQL语句上的差别

Oracle与Sql server都遵循SQL-92标准:http://owen.sj.ca.us/rkowen/howto/sql92F.html,但是也有一些不同之处,差别如下: Oracle中表名,字段名,存储过程名,变量名不能超过30个字符串长度. Oracle中不支持Top 语法.使用whererownum < n 代替.但需要注意如果在Top前有排序的操作,则需要先排序在利用rownum取得. Oracle中光标的使用与SqlServer中有挺大差别,主要是在循环控制方面不一致. 在

Oracle中的Truncate和Delete语句

Oracle中的Truncate和Delete语句 首先讲一下,truncate命令: 语法:TRUNCATE  TABLE  table; 表格里的数据被清空,存储空间被释放. 运行后会自动提交,包括之前其它未提交的会话,因而一旦清空无法回退. 只有表格的创建者或者其他拥有删除任意表格权限的用户(如DBA)才能清空表格. TRUNCATE  TABLE  dept30; Table truncated. ---------------------------------------------

oracle新建用户执行sql查询语句出现错误ORA-00942:表或视图不存在

oracle创建新用户后客户端执行SQL查询后出现错误提示如下: 执行查询语句如下: select * from sm_sales_order; ORA-00942:表或视图不存在 创建新用户并指定表空间和临时表空间 CREATE USER xxx IDENTIFIED BY xxxx DEFAULT TABLESPACE LMS TEMPORARY TABLESPACE TEMP; 授予系统权限connect grant connect to xxx; 授予对象权限,只限查询 grant se

在雇员表中查找第二高的工资SQL语句助记

        "在雇员表中查找第二高的工资的员工记录"SQL语句怎么写         这个查询首先查找最高工资,然后将它从列表中排除,再查找最高工资.很明显,第二次返回的是第二高工资. select top 1 * from employee where salary not int (select max(salary) from emplyee) order by salary desc 或者 select top 1 * from(select top 2 * from em

Oracle的三种高可用集群方案

Oracle的三种高可用集群方案 主要有三种: 1. RAC RAC,  Real Application Clusters 多个Oracle服务器组成一个共享的Cache,而这些Oracle服务器共享一个基于网络的存储.这个系统可以容忍单机/或是多机失败. 不过系统内部的多个节点需要高速网络互连,基本上也就是要全部东西放在在一个机房内,或者说一个数据中心内.如果机房出故障,比如网络不通,那就坏了.所以仅仅用RAC还是满足不了一般互联网公司的重要业务的需要,重要业务需要多机房来容忍单个机房的事故

oracle mysql sql serve where in 语句的不同

类似这样的语句在mysql  oracle 是可以执行成功的, select * from classfirst where (classid ,classname) not in (select classid, classname from classfirst where classid=2 ) 但是在sql server 中提示以下错误 消息 4145,级别 15,状态 1,第 1 行在应使用条件的上下文(在 ',' 附近)中指定了非布尔类型的表达式. 所以在日常的使用中对于sql  s

监控oracle数据库 以及oracle监听 shell脚本

文本格式: #!/bin/bash #Author:wangergui Email:[email protected] Date:2016-10-10 #Release 1.0 #Function: check oracle online declare -a INSTANCE=(PROD EMREP) [[ -f /home/oracle/.bash_profile ]] && . /home/oracle/.bash_profile || exit 3 function check_l