在10g中,Oracle推出了自己的SQL优化辅助工具: SQL优化器(SQL Tuning Advisor :STA),它是新的DBMS_SQLTUNE包。

使用STA一定要保证优化器是CBO模式下。可是我觉得使用这样的工具,仅适合全然不懂SQL的调优的人群,不要觉得工具能解决好问题。

SQL说究竟是表达的是一个业务,工具怎么可能理解业务。SQL调优还是要用autotrace,10046,10053,display_cursor这些优秀的工具做诊断。然后依据业务和所具备的oracle基础的知识进行调优,这是最好的方法。今天在这里玩这个工具仅仅是玩票。

1.创建数据。有益不建索引,然后做查询

SQL> create table test1 as select * from dba_objects;

SQL> create table test2 as select * from dba_objects;

SQL> exec dbms_stats.gather_table_stats(user,'test1');

SQL> exec dbms_stats.gather_table_stats(user,'test2');

SQL> set timing on

SQL> set autotrace traceonly

SQL> select count(*) from test1 t1, test2 t2 where t1.object_id = t2.object_id;

已用时间:  00: 00: 00.07

运行计划

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

Plan hash value: 2544416891

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

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

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

|   0 | SELECT STATEMENT    |       |     1 |    10 |   298   (1)| 00:00:04 |

|   1 |  SORT AGGREGATE     |       |     1 |    10 |            |          |

|*  2 |   HASH JOIN         |       | 50981 |   497K|   298   (1)| 00:00:04 |

|   3 |    TABLE ACCESS FULL| TEST1 | 50982 |   248K|   149   (1)| 00:00:02 |

|   4 |    TABLE ACCESS FULL| TEST2 | 50983 |   248K|   149   (1)| 00:00:02 |

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

Predicate Information (identified by operation id):

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

   2 - access("T1"."OBJECT_ID"="T2"."OBJECT_ID")

统计信息

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

          1  recursive calls

          0  db block gets

       1410  consistent gets

          0  physical reads

          0  redo size

        410  bytes sent via SQL*Net to client

        385  bytes received via SQL*Net from client

          2  SQL*Net roundtrips to/from client

          0  sorts (memory)

          0  sorts (disk)

          1  rows processed

SQL> set autotrace off





2.通过DBMS_SQLTUNE包的CREATE_TUNING_TASK来创建一个优化任务。然后通过DBMS_SQLTUNE.EXECUTE_TUNING_TASK来运行调优任务,生成调优建议。

SQL> DECLARE

       my_task_name VARCHAR2(300);

       my_sqltext   CLOB;

     BEGIN

       my_sqltext := 'select count(*) from test1 t1, test2 t2 where t1.object_id = t2.object_id';

       my_task_name := DBMS_SQLTUNE.CREATE_TUNING_TASK(

               sql_text    => my_sqltext,

               user_name   => 'TEST',   -- 必须大写

               scope       => 'COMPREHENSIVE',

               time_limit  => 10,

               task_name   => 'tuning_sql_test',

               description => 'Task to tune a query on a specified table');

       DBMS_SQLTUNE.EXECUTE_TUNING_TASK( task_name => 'tuning_sql_test');

     END;

/



官方文档解析:

sql_text     The text of a SQL statement

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

          

3.检查优化任务的状态          

SQL> select task_name,ADVISOR_NAME,STATUS from  user_advisor_tasks;

TASK_NAME                      ADVISOR_NAME                   STATUS

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

tuning_sql_test                SQL Tuning Advisor             COMPLETED



4.查看优化结果

SQL> set LONGCHUNKSIZE 999999

SQL> set serveroutput on size 999999

SQL> set long 999999

SQL> select dbms_sqltune.report_tuning_task('tuning_sql_test') from dual;

DBMS_SQLTUNE.REPORT_TUNING_TASK('TUNING_SQL_TEST')

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

GENERAL INFORMATION SECTION

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

Tuning Task Name                  : tuning_sql_test

Tuning Task Owner                 : TEST

Scope                             : COMPREHENSIVE

Time Limit(seconds)               : 10

Completion Status                 : COMPLETED

Started at                        : 05/23/2014 08:50:40

Completed at                      : 05/23/2014 08:50:41

Number of Index Findings          : 1

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

Schema Name: TEST

SQL ID     : afjq3us3nf5dt

SQL Text   : select count(*) from test1 t1, test2 t2 where t1.object_id =

             t2.object_id

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

FINDINGS SECTION (1 finding)

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

1- Index Finding (see explain plans section below)

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

通过创建一个或多个索引能够

  Recommendation (estimated benefit: 100%)

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

  -考虑执行能够改进物理方案设计的 Access Advi

    create index TEST.IDX$$_0C890001 on TEST.TEST1('OBJECT_ID');



  -考虑执行能够改进物理方案设计的 Access Advi

    create index TEST.IDX$$_0C890002 on TEST.TEST2('OBJECT_ID');



  Rationale

  ---------

创建推荐的索引能够显著地改进此语句的运行计划。

可是, 使用典型的

 可能比单个语句更可取。通过这样的方法能够获得全面的索引建

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

EXPLAIN PLANS SECTION

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

1- Original

-----------

Plan hash value: 2544416891

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

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

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

|   0 | SELECT STATEMENT    |       |     1 |    10 |   298   (1)| 00:00:04 |

|   1 |  SORT AGGREGATE     |       |     1 |    10 |            |          |

|*  2 |   HASH JOIN         |       | 50981 |   497K|   298   (1)| 00:00:04 |

|   3 |    TABLE ACCESS FULL| TEST1 | 50982 |   248K|   149   (1)| 00:00:02 |

|   4 |    TABLE ACCESS FULL| TEST2 | 50983 |   248K|   149   (1)| 00:00:02 |

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

Predicate Information (identified by operation id):

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

   2 - access("T1"."OBJECT_ID"="T2"."OBJECT_ID")



2- Using New Indices

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

Plan hash value: 3060659111

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

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

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

|   0 | SELECT STATEMENT       |                |     1 |    10 |    53   (2)| 00:00:01 |

|   1 |  SORT AGGREGATE        |                |     1 |    10 |            |          |

|*  2 |   HASH JOIN            |                | 50981 |   497K|    53   (2)| 00:00:01 |

|   3 |    INDEX FAST FULL SCAN| IDX$$_0C890001 | 50982 |   248K|    26   (0)| 00:00:01 |

|   4 |    INDEX FAST FULL SCAN| IDX$$_0C890002 | 50983 |   248K|    26   (0)| 00:00:01 |

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

Predicate Information (identified by operation id):

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

   2 - access("T1"."OBJECT_ID"="T2"."OBJECT_ID")

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

5.验证一下

依据advisor的建议进行调优,1410降到204,是乎有点效果。

SQL>create index ind_t1_object_id  on test1(object_id);

SQL> create index ind_t2_object_id  on test2(object_id);

SQL> set autotrace traceonly

SQL> select count(*) from test1 t1, test2 t2 where t1.object_id = t2.object_id;

已用时间:  00: 00: 00.06

运行计划

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

Plan hash value: 1069114244

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

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

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

|   0 | SELECT STATEMENT       |                  |     1 |    10 |    51   (2)| 00:00:01 |

|   1 |  SORT AGGREGATE        |                  |     1 |    10 |            |          |

|*  2 |   HASH JOIN            |                  | 50981 |   497K|    51   (2)| 00:00:01 |

|   3 |    INDEX FAST FULL SCAN| IND_T1_OBJECT_ID | 50982 |   248K|    25   (0)| 00:00:01 |

|   4 |    INDEX FAST FULL SCAN| IND_T2_OBJECT_ID | 50983 |   248K|    25   (0)| 00:00:01 |

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

Predicate Information (identified by operation id):

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

   2 - access("T1"."OBJECT_ID"="T2"."OBJECT_ID")

统计信息

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

          1  recursive calls

          0  db block gets

        240  consistent gets

        226  physical reads

          0  redo size

        410  bytes sent via SQL*Net to client

        385  bytes received via SQL*Net from client

          2  SQL*Net roundtrips to/from client

          0  sorts (memory)

          0  sorts (disk)

          1  rows processed

6.删除优化任务

SQL> exec dbms_sqltune.drop_tuning_task('tuning_sql_test');

初次使用SQL调优建议工具--SQL Tuning Advisor的更多相关文章

  1. 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. ...

  2. 记一次SQL调优/优化(SQL tuning)——性能大幅提升千倍以上

    好久不写东西了,一直忙于各种杂事儿,恰巧昨天有个用户研发问到我一个SQL调优的问题,说性能太差,希望我能给调优下,最近有些懒,可能和最近太忙有关系,本来打算问问现在的情况,如果差不多就不调了,那哥们儿 ...

  3. 一个SQL调优/优化(SQL TUNING)“小把戏”“哄得”小朋友挺满意

    前几天,去一个用户那里,解决完问题,和一个小朋友闲聊,他有点愁眉不展.郁郁寡欢的样子,似乎没心情和我说话,之前,他的话是最多的,见此状,我就问:怎么了?小朋友?,他说,这几天应用人员说他的某个模块的性 ...

  4. 快速SQL调优/优化(SQL TUNING)——1分钟搞定超慢SQL

    前几天,一个用户的研发人员找到我了,说他们有个SQL语句非常慢,我说多慢?他们说:半个小时也没出结果.于是问他们要了SQL语句和执行计划,SQL语句就不能再这里贴出来了,下面是调整前的执行计划(略去某 ...

  5. 11g新特性-自动sql调优(Automatic SQL Tuning)

    11g新特性-自动sql调优(Automatic SQL Tuning) 在Oracle 10g中,引进了自动sql调优特性.此外,ADDM也会监控捕获高负载的sql语句. 在Oracle 11g中, ...

  6. [SQL SERVER系列]读书笔记之SQL注入漏洞和SQL调优

    最近读了程序员的SQL金典这本书,觉得里面的SQL注入漏洞和SQL调优总结得不错,下面简单讨论下SQL注入漏洞和SQL调优. 1. SQL注入漏洞 由于“'1'='1'”这个表达式永远返回 true, ...

  7. 读书笔记之SQL注入漏洞和SQL调优

    原文:读书笔记之SQL注入漏洞和SQL调优 最近读了程序员的SQL金典这本书,觉得里面的SQL注入漏洞和SQL调优总结得不错,下面简单讨论下SQL注入漏洞和SQL调优. 1. SQL注入漏洞 由于“' ...

  8. SQL注入漏洞和SQL调优SQL注入漏洞和SQL调优

    SQL注入漏洞和SQL调优 最近读了程序员的SQL金典这本书,觉得里面的SQL注入漏洞和SQL调优总结得不错,下面简单讨论下SQL注入漏洞和SQL调优. 1. SQL注入漏洞 由于“'1'='1'”这 ...

  9. 【叶问】 MySQL常用的sql调优手段或工具有哪些

     MySQL常用的sql调优手段或工具有哪些1.根据执行计划优化   通常使用desc或explain,另外可以添加format=json来输出更详细的json格式的执行计划,主要注意点如下:     ...

随机推荐

  1. Hex Dump In Many Programming Languages

    Hex Dump In Many Programming Languages See also: ArraySumInManyProgrammingLanguages, CounterInManyPr ...

  2. Android Activity、Service、BroadcastReceiver 的生命周期

    Activity.Service.BroadcastReceiver这三个组建是Android开发中最常使用到的组件,在它们的生命周期的各个阶段我们需要针对性的做些事情,了解这些组件的生命周期有利于我 ...

  3. day7 面向对象class()学习

        面向过程 VS 面向对象     编程范式 编程是程序员用特定的语法+数据结构+算法组成的代码来告诉计算机如何执行任务的过程,一个程序是程序员为了得到一个任务结果而编写的一组指令的集合,正所谓 ...

  4. scrapy 设置cookie池

    代码已经很详细了,可以直接拿来使用了. 包含了: 从网页获取cookie 存入mongodb 定期删除cookie scrapy中间件对cookie池的取用 #!/usr/bin/python #co ...

  5. 005 Hadoop的三种模式区别

    1.本地模式 -默认模式. -不对配置文件进行修改. -使用本地文件系统,而不是分布式文件系统. -Hadoop不会启动NameNode.DataNode.ResourceManager.NodeMa ...

  6. 关于mysql中storage_engine中 MYISAM 和 INNODB 的选择

    简单点说 读操作多用myisam 写操作多用innodb 不过现在大家好像基本都用innodb,本人小白一个就直接用InnoDB. MySQL自20多年前成立以来一直支持可插拔存储引擎,但在一段相当长 ...

  7. Docker应用系列(六)| 如何去掉sudo及避免权限问题

    一.如何在使用docker时去掉sudo 1.添加账户 $ sudo groupadd docker 2.授权给docker账户 sudo gpasswd -a yourname docker 3.重 ...

  8. web客户端安全之跨站脚本攻击

    跨站脚本攻击,Cross-site script,是Web程序中最常见的漏洞.为了和CSS层叠样式表区分开,所以取名为 XSS. 一.XSS的重点 跨域和客户端执行. 二.XSS的原理 攻击者向有XS ...

  9. PHP7新特性 What will be in PHP 7/PHPNG

    本文结合php官网和鸟哥相关文章总结: 官网:http://www.php7.ca/   https://wiki.php.net/phpng PHP7将在2015年10月正式发布,PHP7 ,将会是 ...

  10. PAT(Basic Level)--个位数统计

    输入一个不超过1000位的整数,计算每个数字出现的次数. 一道十分简单的题目,最开始以为Java的String没有计算长度的方法,还想了半天,而且还用HashMap做了一次,代码特别长,看了别人的代码 ...