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. 【C#进阶系列】16 数组

    首先提一下,个人在项目中已经很少用到数组了,更多的时候使用List<>. 数组大小固定,如果只是用来存放数据,专门用来读取,更改当然方便.但是更多的时候我们需要进行增删改,这个时候用Lis ...

  2. 使用ActivityManager实现进程管理

    Android中使用ActivityManager可以获得进程信息,并对进程进行管理,如结束进程等.本文使用ActivityManager获得进程列表,并结束选中的进程. 首先,看看布局文件. < ...

  3. HTTPResponse object — JSON object must be str, not 'bytes'

    http://stackoverflow.com/questions/24069197/httpresponse-object-json-object-must-be-str-not-bytes HT ...

  4. Oracle的建立表格

    找到table右键点击,选择新建: 输入名称,用拼音或者英文,中文容易出现错误.输入完名称选择列: 列也写好名称,类型可以选择,VARCHAR2()是字符串类型,括号里面写数字代表长度,英文字母和数字 ...

  5. objective-c高德地图时时定位

    这篇随笔是对上一遍servlet接口的实现. 一.项目集成高德地图 应为我这个项目使用了cocopods这个第三方库管理工具,所以只需要很简单的步骤,就能将高德地图集成到项目中,如果你没使用过这工具, ...

  6. 项目总结笔记系列 Social Hub KT Session1

    项目后台访问地址: URL:http://socialhub-itg-app.itcs.hp.com/data_feed_service/main.jsp 或者URL:http://c0048925. ...

  7. [javaSE] 注解-JDK中的注解

    java中的常见注解 jdk自带注解:@Override 覆盖  @Deprecated 过期  @Suppvisewarnings 压制警告 package com.tsh.ano; public ...

  8. 设置placeholder字体颜色

    /*设置placeholder字体颜色*/::-webkit-input-placeholder{ color: #FFF;}:-ms-input-placeholder{ color: #FFF;} ...

  9. ADO.NET(数据访问技术)

    简单的说,C#已经内置了一些类,我们可以利用这些类来访问数据库.在这里,我们假设读者已经熟悉SqlServer数据库或者其它数据库(我以后也会补上相关内容).我们如何来实现这项技术呢?大致可以分为三个 ...

  10. Zend Studio 中导出 PHP 语法颜色配置

    Zend Studio 中,虽然可以自行配置 PHP 语法颜色,但是,没有导出配置的按钮.介个,总不能每次都配置一次吧,那不是累死伦家啦?有图有真相: 强迫症患者总是无法停止折腾,虽然内心总有个声音不 ...