ORACLE 10g提供了一个脚本sqltrpt.sql用来查询最耗费资源的SQL语句,其输出的结果分为两部分:

15 Most expensive SQL in the cursor cache

15 Most expensive SQL in the workload repository

另外可以根据输入的SQL_ID,生成对应执行计划和调优建议,是一个不错的调优优化脚本。其实是sqltrpt是SQL Tune Report的缩写。这个脚本位于$ORACLE_HOME/rdbms/admin/sqltrpt.sql。 具体脚本如下所示

Rem

Rem $Header: sqltrpt.sql 11-apr-2005.11:01:39 pbelknap Exp $

Rem

Rem sqltrpt.sql

Rem

Rem Copyright (c) 2004, 2005, Oracle. All rights reserved.  

Rem

Rem    NAME

Rem      sqltrpt.sql - SQL Tune RePorT

Rem

Rem    DESCRIPTION

Rem      Script that gets a single statement as input from the user (via SQLID),

Rem      tunes that statement, and then displays the text report.

Rem

Rem      To tune multiple statements, create a sql tuning set and create a

Rem      tuning task with it as input (see dbmssqlt.sql).

Rem

Rem    NOTES

Rem      <other useful comments, qualifications, etc.>

Rem

Rem    MODIFIED   (MM/DD/YY)

Rem    pbelknap    04/11/05 - remove linesize 

Rem    kyagoub     07/05/04 - kyagoub_proj_13448-2

Rem    pbelknap    06/29/04 - feedback from rae burns 

Rem    pbelknap    06/17/04 - Created

Rem

 

SET NUMWIDTH 10

SET TAB OFF

 

 

set long 1000000;

set longchunksize 1000;

set feedback off;

set veri off;

 

-- Get the sql statement to tune

 

prompt

prompt 15 Most expensive SQL in the cursor cache

prompt ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

 

column elapsed format 99,990.90;

variable newl varchar2(64);

 

begin

  :newl := '

';

end;

/

 

select * from (

 select sql_id, elapsed_time / 1000000 as elapsed, SUBSTRB(REPLACE(sql_text,:newl,' '),1,55) as sql_text_fragment

 from   V$SQLSTATS

 order by elapsed_time desc

) where ROWNUM <= 15;

 

prompt

prompt 15 Most expensive SQL in the workload repository

prompt ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

 

select * from (

 select stat.sql_id as sql_id, sum(elapsed_time_delta) / 1000000 as elapsed, 

     (select to_char(substr(replace(st.sql_text,:newl,' '),1,55)) 

     from dba_hist_sqltext st

     where st.dbid = stat.dbid and st.sql_id = stat.sql_id) as sql_text_fragment

 from dba_hist_sqlstat stat, dba_hist_sqltext text

 where stat.sql_id = text.sql_id and

       stat.dbid   = text.dbid

 group by stat.dbid, stat.sql_id

 order by elapsed desc

) where ROWNUM <= 15;

 

prompt

prompt Specify the Sql id

prompt ~~~~~~~~~~~~~~~~~~

column sqlid new_value sqlid;

set heading off;

select 'Sql Id specified: &&sqlid' from dual;

set heading on;

 

prompt

prompt Tune the sql

prompt ~~~~~~~~~~~~

variable task_name varchar2(64);

variable err       number;

 

-- By default, no error

execute :err := 0;

 

set serveroutput on;

 

DECLARE

  cnt      NUMBER;

  bid      NUMBER;

  eid      NUMBER;

BEGIN

  -- If it's not in V$SQL we will have to query the workload repository

  select count(*) into cnt from V$SQLSTATS where sql_id = '&&sqlid';

 

  IF (cnt > 0) THEN

    :task_name := dbms_sqltune.create_tuning_task(sql_id => '&&sqlid');

  ELSE

    select min(snap_id) into bid

    from   dba_hist_sqlstat

    where  sql_id = '&&sqlid';

 

    select max(snap_id) into eid

    from   dba_hist_sqlstat

    where  sql_id = '&&sqlid';

 

    :task_name := dbms_sqltune.create_tuning_task(begin_snap => bid,

                                                  end_snap => eid,

                                                  sql_id => '&&sqlid');

  END IF;

 

  dbms_sqltune.execute_tuning_task(:task_name);

 

EXCEPTION

  WHEN OTHERS THEN

    :err := 1;

 

    IF (SQLCODE = -13780) THEN

      dbms_output.put_line ('ERROR: statement is not in the cursor cache ' ||

                            'or the workload repository.');

      dbms_output.put_line('Execute the statement and try again');

    ELSE

      RAISE;

    END IF;   

 

END;

/

 

set heading off;

select dbms_sqltune.report_tuning_task(:task_name) from dual where :err <> 1;

select '   ' from dual where :err = 1;

set heading on;

 

undefine sqlid;

set feedback on;

set veri on;

一般在sqlplus里面执行下面命令@?/rdbms/admin/sqltrpt即可。它生成调优优化建议是通过调用dbms_sqltune包来完成的。使用它很大程度上方便我们对一些SQL的分析和优化。下面我们构造一个调优例子,如下所示,很简单的一个脚本,其中PRDNO的数据类型为VARCHAR(32),在这个字段上建有唯一索引,但是我们故意构造了下面这样会发生隐式转换的SQL,假设这是某个应用程序发出的脚本,下面会看到一个预估的执行计划是走Index Scan,在sqltrtp里面看到的实际执行计划走全表扫描。

SQL> set linesize 1200

SQL> set autotrace on;

SQL> variable prd_no nvarchar2(20);

SQL> exec :prd_no :='01A10133301I';

 

PL/SQL procedure successfully completed.

 

SQL> SELECT  COUNT(1) FROM TEST

  2  WHERE PRDNO=:prd_no  

  3    AND JO_STATUS<>'L2'  

  4    AND STATUS<>'X';

 

  COUNT(1)

----------

         0

 

 

Execution Plan

----------------------------------------------------------

Plan hash value: 2198057827

 

----------------------------------------------------------------------------------------

| Id  | Operation                    | Name    | Rows  | Bytes | Cost (%CPU)| Time     |

----------------------------------------------------------------------------------------

|   0 | SELECT STATEMENT             |         |     1 |    17 |     3   (0)| 00:00:01 |

|   1 |  SORT AGGREGATE              |         |     1 |    17 |            |          |

|*  2 |   TABLE ACCESS BY INDEX ROWID| TEST    |     1 |    17 |     3   (0)| 00:00:01 |

|*  3 |    INDEX UNIQUE SCAN         | PK_TEST |     1 |       |     2   (0)| 00:00:01 |

----------------------------------------------------------------------------------------

Predicate Information (identified by operation id):

---------------------------------------------------

   2 - filter("JO_STATUS"<>'L2' AND "STATUS"<>'X')

   3 - access("PRDNO"=:PRD_NO)

 

 

Statistics

----------------------------------------------------------

          0  recursive calls

          0  db block gets

     112319  consistent gets

     112279  physical reads

          0  redo size

        514  bytes sent via SQL*Net to client

        492  bytes received via SQL*Net from client

          2  SQL*Net roundtrips to/from client

          0  sorts (memory)

          0  sorts (disk)

          1  rows processed

 

SQL> 

我们先找到该SQL对应的SQL_ID,执行sqltrpt,就会看到对应的分析优化建议,例如它提示语句存在隐式转换,如下截图所示,建议你优化这个问题。

SQL Tune Report–sqltrpt.sql的更多相关文章

  1. Freebie - Utility Form: Generate Excel Report From SQL Query In Oracle Forms 6i And 11g

    Sharing a form to generate Excel file report from SQL query in Oracle Forms. This form can be used i ...

  2. SSRS (SQL Server Report Service) 在IE9, IE10下显示不全的解决办法

    原文:SSRS (SQL Server Report Service) 在IE9, IE10下显示不全的解决办法 在做项目的过程中遇到SSRS与IE9, IE10不兼容的情况,具体表现为报表页面在IE ...

  3. Java服务器端生成报告文档:使用SQL Server Report Service(SSRS)

    SQL Server Report Service(SSRS)提供了Asp.Net和WinForm两类客户端组件封装,因此使用C#实现SSRS报表的导出功能,仅需要使用相应的组件即可. Java操作S ...

  4. Sql Server Report Service 的部署问题(Reporting Service 2014為什麼不需要IIS就可以運行)

    http://www.cnblogs.com/syfblog/p/4651621.html Sql Server Report Service 的部署问题 近期在研究SSRS部署问题,因为以前也用到过 ...

  5. Sql Server Report 导出到EXCEL 指定行高

    在SQL SERVER REPORT 2005做报表的时候,发现在report中指定的行高没有用.google了一下,找到了解决方法. Make both CanGrow and CanShrink ...

  6. SQL Server Report Server

    1.SQL Server Report Server是利用mircosoft的share point产品 在menu 打开Reporting Services Configuration进行配置,会自 ...

  7. Oracle SQL调优系列之SQL Monitor Report

    @ 目录 1.SQL Monitor简介 2.捕捉sql的前提 3.SQL Monitor 参数设置 4.SQL Monitor Report 4.1.SQL_ID获取 4.2.Text文本格式 4. ...

  8. 使用hint优化Oracle的运行计划 以及 SQL Tune Advisor的使用

    背景: 某表忽然出现查询很缓慢的情况.cost 100+ 秒以上:严重影响生产. 原SQL: explain plan for select * from ( select ID id,RET_NO ...

  9. 怎样使用oracle 的DBMS_SQLTUNE package 来执行 Sql Tuning Advisor 进行sql 自己主动调优

     怎样使用oracle 的DBMS_SQLTUNE package 来执行 Sql Tuning Advisor 进行sql 自己主动调优 1>.这里简单举个样例来说明DBMS_SQLTUN ...

随机推荐

  1. Access数据导入SQLServer2008R2

    环境:office Access 2010+SQLServer2008R2+Windows Server 2008R2 方式:Transact-SQL 方法: 1. 在SQL SERVER里查询acc ...

  2. 项目中的web api知识总结

    最近在做公司的项目,自己负责webapi的框架的搭建与开发,最近很忙,一直没时间对工作中遇到的知识点缺少个总结,现总结一下,对自己是个提升,如果个人的小点点小总结能对博友有帮助那也是善莫大焉. (1) ...

  3. 不可或缺 Windows Native (21) - C++: 继承, 组合, 派生类的构造函数和析构函数, 基类与派生类的转换, 子对象的实例化, 基类成员的隐藏(派生类成员覆盖基类成员)

    [源码下载] 不可或缺 Windows Native (21) - C++: 继承, 组合, 派生类的构造函数和析构函数, 基类与派生类的转换, 子对象的实例化, 基类成员的隐藏(派生类成员覆盖基类成 ...

  4. Servlet与多线程与IO操作

    1.JVM内存模型相关概念 2.Java多线程并发深入理解 3.Servlet.设计模式.SpringMVC深入理解 4.Java基础遗漏点补充 数据库连接池:JDBC connection pool ...

  5. js中typeof的使用方法

    typeof在js中是一个一元操作符,可以判断操作数的类型,其返回值为字符串,有number.string.object.boolean.function.undefined.使用方式可以是typeo ...

  6. 操作系统与c语言

      以下是根据看书后的理解做的总结:   最早,unix是使用汇编编写,但是非常简单.后来觉得汇编,换种机器又得重新用另外一种机器汇编重写,太麻烦.于是想设计一种通用的语言,到各种机器上都能运行 当时 ...

  7. Android填坑系列:在小米系列等机型上放开定位权限后的定位请求弹框

    背景: 近期因实际项目需要,在特定操作下触发定位请求,取到用户位置及附近位置. 问题: 经初步选型,最终决定接入百度定位,按照百度定位SDK Android文档,接入过程相对顺利.但随后发现,在小米系 ...

  8. TestNG 三 测试方法

    一.设置参数 测试方法是可以带有参数的.每个测试方法都可以带有任意数量的参数,并且可以通过使用TestNG的@Parameters向方法传递正确的参数. 设置方式有两种方法:使用testng.xml或 ...

  9. nginx性能优化之线程池

    默认情况下,nginx的work process按照顺序一个个处理http请求,因此如果后台处理时间较长,则work process会长时间等待IO状态,因此限制并发性.如下所示: 所以,对于可能存在 ...

  10. SPRING SECURITY 拦截静态资源

    情景: <security:intercept-url pattern="/**" access="USER"/> 当在spring securti ...