DBMS_SQLTUNE优化SQL是在oracle10g才出来的新特性,使用它能很大程度上方便对sql的分析和优化。执行DBMS_SQLTUNE包进行sql优化需要有advisor的权限:

stat>grant advisor to stat;

Grant succeeded.

使用DBMS_SQLTUNE包进行SQL优化,大致可以分为四个步骤:

创建优化任务 
执行优化任务 
显示优化任务的结果 
按照建议执行优化

一、创建优化任务
使用dbms_sqltune.create_tuning_task函数来创建优化任务,该参数的声明 可以通过 desc dbms_sqltune.create_tuning_task 来查看。以下是一些主要的参数的意义。
Parameter Description
sql_text The text of a SQL statement
begin_snap Begin snapshot identifier
end_snap End snapshot identifier
sql_id  The identifier of a SQL statement
bind_list An ordered list of bind values in ANYDATA type
plan_hash_value The hash value of the SQL execution plan
sqlset_name The SQL tuning set name
basic_filter The SQL predicate to filter the SQL from the SQL tuning set
object_filter The object filter
rank(i)  An order-by clause on the selected SQL
result_percentage A percentage on the sum of a ranking measure
result_limit The top L(imit) SQL from the (filtered/ranked) SQL
user_name The username for whom the statement is to be tuned
scope Tuning scope (limited/comprehensive)
time_limit The maximum duration in seconds for the tuning session
task_name An optional tuning task name
description A task of the SQL tuning session to a maximum of 256 characters
函数的返回值为创建的任务名。下面我们创建一个叫sql_tuning_test的任务:

代码:--------------------------------------------------------------------------------
DECLARE
my_task_name   VARCHAR2 (30);
my_sqltext     CLOB;
BEGIN
my_sqltext :=  'select * from tj_balance_cid_200907 where clientcode=''sadfasfds''';
 my_task_name := dbms_sqltune.create_tuning_task (sql_text=> my_sqltext,
       bind_list     => null,
       user_name     => 'STAT',
       scope         => 'COMPREHENSIVE',
       time_limit    => 60,
       task_name     => 'vega_tuning_task',         
       description   => 'Tuning Task'
    );
END;
/

PL/SQL procedure successfully completed.
--------------------------------------------------------------------------------

二、执行优化任务

通过调用dbms_sqltune.execute_tuning_task过程来执行前面创建好的优化任务。

exec dbms_sqltune.execute_tuning_task('sql_tuning_test');

PL/SQL procedure successfully completed.
--------------------------------------------------------------------------------

三、检查优化任务的状态

通过查看user_advisor_tasks/dba_advisor_tasks视图可以查看优化任务的当前状态。

代码:--------------------------------------------------------------------------------
SELECT status FROM USER_ADVISOR_TASKS WHERE task_name ='sql_tuning_test';

STATUS
-----------
COMPLETED
--------------------------------------------------------------------------------

四、得到优化任务执行的结果

通过dbms_sqltune.report_tning_task函数可以获得优化任务的结果。

代码:--------------------------------------------------------------------------------
SET LONG 999999
set serveroutput on size 999999
SET LINESIZE 1000
SELECT DBMS_SQLTUNE.REPORT_TUNING_TASK('sql_tuning_test') FROM DUAL;

DBMS_SQLTUNE.REPORT_TUNING_TAS
--------------------------------------------------------------------------------
GENERAL INFORMATION SECTION
-------------------------------------------------------------------------------
Tuning Task Name                  : vega_tuning_task
Tuning Task Owner                 : STAT
Workload Type                     : Single SQL Statement
Execution Count                   : 2
Current Execution                 : EXEC_4345_1
Execution Type                    : TUNE SQL
Scope                             : COMPREHENSIVE
Time Limit(seconds)               : 60
Completion Status                 : COMPLETED
Started at                        : 08/04/2009 09:41:09
Completed at                      : 08/04/2009 09:41:10

-------------------------------------------------------------------------------
Schema Name: STAT
SQL ID     : fgj1uaa7dkgt8
SQL Text   : select * from tj_balance_cid_200907 where clientcode='sadfasfds'

-------------------------------------------------------------------------------
FINDINGS SECTION (1 finding)
-------------------------------------------------------------------------------

1- Index Finding (see explain plans section below)
--------------------------------------------------
  通过创建一个或多个索引可以改进此语句的执行计划。

Recommendation (estimated benefit: 94.36%)
  ------------------------------------------
  - 考虑运行可以改进物理方案设计的访问指导或者创建推荐的索引。
    create index STAT.IDX$$_10F90001 on STAT.TJ_BALANCE_CID_200907("CLIENTCODE"
    );

Rationale
  ---------
    创建推荐的索引可以显著地改进此语句的执行计划。但是, 使用典型的 SQL 工作量运?
    可能比单个语句更可取。通过这种方法可以获得全面的索引建议案, 包括计算索引维护

-------------------------------------------------------------------------------
EXPLAIN PLANS SECTION
-------------------------------------------------------------------------------

1- Original
-----------
Plan hash value: 494025501

--------------------------------------------------------------------------------
| Id  | Operation                             | Name                         | R
--------------------------------------------------------------------------------
|   0 | SELECT STATEMENT                      |                              |
|   1 |  PARTITION LIST ALL                   |                              |
|   2 |   MAT_VIEW ACCESS BY LOCAL INDEX ROWID| TJ_BALANCE_CID_200907        |
|*  3 |    INDEX RANGE SCAN                   | IDX_TJ_BALANCE_CID_200907_01 |
--------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

3 - access("CLIENTCODE"='sadfasfds')

2- Using New Indices
--------------------
Plan hash value: 3010982149

--------------------------------------------------------------------------------
| Id  | Operation                             | Name                  | Rows  |
--------------------------------------------------------------------------------
|   0 | SELECT STATEMENT                      |                       |    10 |
|   1 |  MAT_VIEW ACCESS BY GLOBAL INDEX ROWID| TJ_BALANCE_CID_200907 |    10 |
|*  2 |   INDEX RANGE SCAN                    | IDX$$_10F90001        |    10 |
--------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

2 - access("CLIENTCODE"='sadfasfds')

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

然后我们就可以根据Recommendation部分的建议来执行优化操作了。

五、删除优化任务

通过调用dbms_sqltuen.drop_tuning_task可以删除已经存在的优化任务

代码:--------------------------------------------------------------------------------
exec dbms_sqltune.drop_tuning_task('sql_tuning_test');

PL/SQL procedure successfully completed.

利用DBMS_SQLTUNE优化SQL的更多相关文章

  1. 【转】使用SQL Tuning Advisor STA优化SQL

    SQL优化器(SQL Tuning Advisor STA)是Oracle10g中推出的帮助DBA优化工具,它的特点是简单.智能,DBA值需要调用函数就可以给出一个性能很差的语句的优化结果.下面介绍一 ...

  2. advisor调优工具优化sql(基于sql_id)

    advisor调优工具优化sql(基于sql_id) 问题背景:客户反馈数据库迁移后cpu负载激增,帮忙查看原因 解决思路:1> 查看问题系统发现有大量的latch: cache buffers ...

  3. 如何用 SQL Tuning Advisor (STA) 优化SQL语句

    在Oracle10g之前,优化SQL是个比较费力的技术活,不停的分析执行计划,加hint,分析统计信息等等.在10g中,Oracle推出了自己的SQL优化辅助工具: SQL优化器(SQL Tuning ...

  4. sql语句优化SQL Server

    MS   SQL   Server查询优化方法查询速度慢的原因很多,常见如下几种 1.没有索引或者没有用到索引(这是查询慢最常见的问题,是程序设计的缺陷)          2.I/O吞吐量小,形成了 ...

  5. mysql优化SQL语句的一般步骤及常用方法

    一.优化SQL语句的一般步骤 1. 通过show status命令了解各种SQL的执行频率 mysqladmin extended-status 或: show [session|global]sta ...

  6. 转载 50种方法优化SQL Server数据库查询

    原文地址 http://www.cnblogs.com/zhycyq/articles/2636748.html 50种方法优化SQL Server数据库查询 查询速度慢的原因很多,常见如下几种: 1 ...

  7. MySQL查询不使用索引汇总 + 如何优化sql语句

    不使用索引原文 : http://itlab.idcquan.com/linux/MYSQL/918330.html MySQL查询不使用索引汇总 众所周知,增加索引是提高查询速度的有效途径,但是很多 ...

  8. 浅谈MySQL中优化sql语句查询常用的30种方法 - 转载

    浅谈MySQL中优化sql语句查询常用的30种方法 1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中使 ...

  9. 应用索引技术优化SQL 语句(转)

    原文出处 一.前言 很多数据库系统性能不理想是因为系统没有经过整体优化,存在大量性能低下的SQL 语句.这类SQL语句性能不好的首要原因是缺乏高效的索引.没有索引除了导致语句本身运行速度慢外,更是导致 ...

随机推荐

  1. guice基本使用,常用的绑定方式(四)

    guice在moudle中提供了良好的绑定方法. 它提供了普通的绑定,自定义注解绑定,按名称绑定等. 下面直接看代码: package com.ming.user.test; import com.g ...

  2. WPF MVVM 关闭窗体

    由于程序采用MVVM模式同时有些操作需要单独窗口来进行处理.因此就会产生窗口关闭问题, 由于是MVVM和需要操作弹出窗口中操作的内容因此就需要在mvvm进行统一处理. 网上查了几种方法采用其中一种 不 ...

  3. 使用DbVisualizer变量

    变量可用于构建参数化SQL语句,并让DbVisualizer在执行SQL时提示您输入值.如果您重复执行相同的SQL,只是希望在同一个SQL语句中传递新数据,这很方便. 变量语法 变量格式支持设置默认值 ...

  4. 在无任何报错的情况下 pagehelper.startpage分页无效问题

    问题原因:自从spring boot开始使用2.0x版本以上后,很多相应的依赖文件版本开始变化 该版本为spring-boot 1.4.1 <dependency> <groupId ...

  5. 杭电1229 还是A+B

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1229 解题思路,最开始想的是把输入的数据存入数组中,比如输入 1,在数组中就储存为1000(因为数据不 ...

  6. 图片无损放大软件PhotoZoom分屏预览功能 ,简直好用!

    PhotoZoom是一款智能放大图片软件,很多用户在初次使用PhotoZoom,发现图片所处的区域上方有四个不同方式的预览选项.因为很多初学者使用时不明白这四个按钮有什么作用,所以小编接下来讲解一下P ...

  7. 转载:jquery 对 Json 的各种遍历

    概述 JSON(javascript Object Notation) 是一种轻量级的数据交换格式,采用完全独立于语言的文本格式,是理想的数据交换格式.同时,JSON是 JavaScript 原生格式 ...

  8. 【转】DBSCAN密度聚类算法

    DBSCAN(Density-Based Spatial Clustering of Applications with Noise,具有噪声的基于密度的聚类方法)是一种很典型的密度聚类算法,和K-M ...

  9. TensorFlow技术解析与实战学习笔记(13)------Mnist识别和卷积神经网络AlexNet

    一.AlexNet:共8层:5个卷积层(卷积+池化).3个全连接层,输出到softmax层,产生分类. 论文中lrn层推荐的参数:depth_radius = 4,bias = 1.0 , alpha ...

  10. MySQL导入到SQLServer

    Mysql是在Linux环境服务器,MSSQL在windows服务器上 1.在MSServer中安装VPN 2.为VPN配置Mysql服务器账号 3.账号中的文件 4.在MSSQL服务器上安装mysq ...