广告
返回顶部
首页 > 资讯 > 数据库 >Oracle SQL 优化之sql tuning advisor (STA)
  • 601
分享到

Oracle SQL 优化之sql tuning advisor (STA)

2024-04-02 19:04:59 601人浏览 薄情痞子
摘要

前言: 经常可以碰到优化sql的需求,开发人员直接扔过来一个SQL让DBA优化,然后怎么办? 当然,经验丰富的DBA可以从各种方向下手,有时通过建立正确索引即可获得很好的优化效果,但是那些复杂SQ

前言: 经常可以碰到优化sql的需求,开发人员直接扔过来一个SQL让DBA优化,然后怎么办?

当然,经验丰富的DBA可以从各种方向下手,有时通过建立正确索引即可获得很好的优化效果,但是那些复杂SQL错综复杂的表关联,却让DBA们满头大汗。

如下特别介绍一种oracle官方提供的科学优化方法STA,经过实践,不敢说此特性绝对有效,但是可以开阔思路,并且从中学到许多知识,不再用“猜”的方式去创建索引了。

 

SQL优化器 SQL Tuning Advisor  (STA),是oracle的sql优化补助工具
其实优化sql主要有两个方案,其一是改写sql本身,改写sql需要对sql语法、数据库的执行方式都要有较好地理解。
其二就是这个STA,它属于DBMS_SQLTUNE包,它的主要作用是对于sql使用到的表创建正确的索引。

使用STA前提:

Oracle SQL 优化之sql tuning advisor (STA)


要保证优化器是CBO模式下。
show parameter OPTIMIZER_MODE
all_rows  first_rows  first_rows_n  choose  rule  执行DBMS_SQLTUNE包进行sql优化需要有advisor的权限:grant advisor to scott;

Oracle SQL 优化之sql tuning advisor (STA)

 

如下是STA使用例子:

1.首先创建两个练习表obj与ind,仅创建表,无需创建索引:

Oracle SQL 优化之sql tuning advisor (STA)


SQL> create table obj as select * from dba_objects;
表已创建。
SQL> create table ind as select * from dba_indexes;
表已创建。
SQL> insert into obj select * from obj;
已创建 74603 行。
SQL> insert into obj select * from obj;
已创建 149206 行。
SQL> insert into obj select * from obj;
已创建 298412 行。
SQL> insert into ind select * from ind;
已创建 5134 行。
SQL> insert into ind select * from ind;
已创建 10268 行。
SQL> insert into ind select * from ind;
已创建 20536 行。

Oracle SQL 优化之sql tuning advisor (STA)

 

2.然后对这两个表,obj与ind进行联合查询,并通过autotrace查看其执行计划:

Oracle SQL 优化之sql tuning advisor (STA)


SQL> set timing onSQL> set autot trace
SQL> select count(*) from obj o, ind i where o.object_name=i.index_name;
已用时间:  00: 00: 00.15执行计划----------------------------------------------------------Plan hash value: 380737209------------------------------------------------------------------------------------| Id  | Operation           | Name | Rows  | Bytes |TempSpc| Cost (%CPU)| Time     |------------------------------------------------------------------------------------|   0 | SELECT STATEMENT    |      |     1 |    83 |       |  5063   (1)| 00:01:01 ||   1 |  SORT AGGREGATE     |      |     1 |    83 |       |            |          ||*  2 |   HASH JOIN         |      |  5861K|   463M|  1272K|  5063   (1)| 00:01:01 ||   3 |    TABLE ACCESS FULL| IND  | 44789 |   743K|       |   379   (1)| 00:00:05 ||   4 |    TABLE ACCESS FULL| OBJ  |   577K|    36M|       |  2472   (1)| 00:00:30 |------------------------------------------------------------------------------------Predicate InfORMation (identified by operation id):---------------------------------------------------
   2 - access("O"."OBJECT_NAME"="I"."INDEX_NAME")
Note-----
   - dynamic sampling used for this statement (level=2)
统计信息----------------------------------------------------------
          9  recursive calls          4  db block gets      10406  consistent gets          0  physical reads          0  redo size        425  bytes sent via SQL*Net to client        415  bytes received via SQL*Net from client          2  SQL*Net roundtrips to/from client          0  sorts (memory)          0  sorts (disk)          1  rows processed

Oracle SQL 优化之sql tuning advisor (STA)

通过执行计划,可以清晰的看到,在执行以上两个表的联合查询的时候,两张表走的全表扫和hash join。



正式使用STA进行优化:
第一步:创建优化任务
通过调用函数DBMS_SQLTUNE.CREATE_TUNING_TASK来创建优化任务,调用存储过程DBMS_SQLTUNE.EXECUTE_TUNING_TASK执行该任务:

Oracle SQL 优化之sql tuning advisor (STA)


SQL> set autot offSQL> set timing offDECLAREmy_task_name VARCHAR2(30);
my_sqltext  CLOB;BEGINmy_sqltext := 'select count(*) from obj o, ind i where o.object_name=i.index_name';
my_task_name := DBMS_SQLTUNE.CREATE_TUNING_TASK(
sql_text    => my_sqltext,user_name   => 'SCOTT', 
scope       => 'COMPREHENSIVE',
time_limit  => 30,
task_name   => 'tuning_sql_test',
description => 'tuning');
DBMS_SQLTUNE.EXECUTE_TUNING_TASK( task_name => 'tuning_sql_test');END;/PL/SQL 过程已成功完成。

Oracle SQL 优化之sql tuning advisor (STA)

如下是参数解释:

函数CREATE_TUNING_TASK,
sql_text是需要优化的语句,
user_name是该语句通过哪个用户执行,用户名大写,
scope是优化范围(limited或comprehensive),
time_limit优化过程的时间限制,
task_name优化任务名称,
description优化任务描述。


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


SQL> exec dbms_sqltune.execute_tuning_task('tuning_sql_test');
PL/SQL 过程已成功完成。

 

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


SQL> SELECT task_name,status FROM USER_ADVISOR_TASKS WHERE task_name ='tuning_sql_test';
TASK_NAME         STATUS------------------------------ -----------tuning_sql_test         COMPLETED


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


SQL> set long 999999SQL> set serveroutput on size 999999SQL> set line 120SQL> select DBMS_SQLTUNE.REPORT_TUNING_TASK( 'tuning_sql_test') from dual;

 

 如下是显示优化的结果:

Oracle SQL 优化之sql tuning advisor (STA)


DBMS_SQLTUNE.REPORT_TUNING_TASK('TUNING_SQL_TEST')--------------------------------------------------------------------------------GENERAL INFORMATION SECTION-------------------------------------------------------------------------------Tuning Task Name   : tuning_sql_test
Tuning Task Owner  : SCOTT
Workload Type      : Single SQL Statement
Execution Count    : 2Current Execution  : EXEC_112
Execution Type     : TUNE SQL
Scope              : COMPREHENSIVE
Time Limit(seconds): 30Completion Status  : COMPLETED
Started at         : 08/29/2013 11:10:10Completed at       : 08/29/2013 11:10:12-------------------------------------------------------------------------------Schema Name: SCOTT
SQL ID     : 6wruu2mxyu8g3
SQL Text   : select count(*) from obj o, ind i where
             o.object_name=i.index_name-------------------------------------------------------------------------------FINDINGS SECTION (3 findings)-------------------------------------------------------------------------------1- Statistics Finding---------------------  尚未分析表 "SCOTT"."IND"。
  Recommendation  --------------
  - 考虑收集此表的优化程序统计信息。    execute dbms_stats.gather_table_stats(ownname => 'SCOTT', tabname => 'IND', estimate_percent => DBMS_STATS.AUTO_SAMPLE_SIZE,method_opt => 'FOR ALL COLUMNS SIZE AUTO');
  Rationale  ---------    为了选择好的执行计划, 优化程序需要此表的最新统计信息。2- Statistics Finding---------------------  尚未分析表 "SCOTT"."OBJ"。
  Recommendation  --------------
  - 考虑收集此表的优化程序统计信息。    execute dbms_stats.gather_table_stats(ownname => 'SCOTT', tabname => 'OBJ', estimate_percent => DBMS_STATS.AUTO_SAMPLE_SIZE,method_opt => 'FOR ALL COLUMNS SIZE AUTO');
  Rationale  ---------    为了选择好的执行计划, 优化程序需要此表的最新统计信息。3- Index Finding (see explain plans section below)--------------------------------------------------  通过创建一个或多个索引可以改进此语句的执行计划。
  Recommendation (estimated benefit: 75.74%)  ------------------------------------------
  - 考虑运行可以改进物理方案设计的访问指导或者创建推荐的索引。    create index SCOTT.IDX$$_00790001 on SCOTT.OBJ("OBJECT_NAME");  - 考虑运行可以改进物理方案设计的访问指导或者创建推荐的索引。    create index SCOTT.IDX$$_00790002 on SCOTT.IND("INDEX_NAME");
  Rationale  ---------    创建推荐的索引可以显著地改进此语句的执行计划。但是, 使用典型的 SQL 工作量运行 "访问指导"
    可能比单个语句更可取。通过这种方法可以获得全面的索引建议案, 包括计算索引维护的开销和附加的空间消耗。

Oracle SQL 优化之sql tuning advisor (STA)

Oracle SQL 优化之sql tuning advisor (STA)


-------------------------------------------------------------------------------EXPLAIN PLANS SECTION-------------------------------------------------------------------------------1- Original-----------Plan hash value: 380737209------------------------------------------------------------------------------------| Id  | Operation           | Name | Rows  | Bytes |TempSpc| Cost (%CPU)| Time|------------------------------------------------------------------------------------|   0 | SELECT STATEMENT    |      |     1 |    83 |       |  5063   (1)| 00:01:01 ||   1 |  SORT AGGREGATE     |      |     1 |    83 |       |            |          ||*  2 |   HASH JOIN         |      |  5861K|   463M|  1272K|  5063   (1)| 00:01:01 ||   3 |    TABLE ACCESS FULL| IND  | 44789 |   743K|       |   379   (1)| 00:00:05 ||   4 |    TABLE ACCESS FULL| OBJ  |   577K|    36M|       |  2472   (1)| 00:00:30 |------------------------------------------------------------------------------------Predicate Information (identified by operation id):---------------------------------------------------
   2 - access("O"."OBJECT_NAME"="I"."INDEX_NAME")2- Using New Indices--------------------Plan hash value: 4048334321--------------------------------------------------------------------------------------------------| Id  | Operation               | Name           | Rows  | Bytes |TempSpc| Cost (%CPU)| Time     |--------------------------------------------------------------------------------------------------|   0 | SELECT STATEMENT        |                |     1 |    83 |       |  1228   (2)| 00:00:15 ||   1 |  SORT AGGREGATE         |                |     1 |    83 |       |            |||   2 |   MERGE JOIN            |                |  5861K|   463M|       |  1228   (2)| 00:00:15 ||   3 |    INDEX FULL SCAN      | IDX$$_00790001 |   577K|    36M|       |   944   (1)| 00:00:12 ||*  4 |    SORT JOIN            |                | 44789 |   743K|  2120K|   268   (1)| 00:00:04 ||   5 |     INDEX FAST FULL SCAN| IDX$$_00790002 | 44789 |   743K|       |    18   (0)| 00:00:01 |--------------------------------------------------------------------------------------------------Predicate Information (identified by operation id):---------------------------------------------------
   4 - access("O"."OBJECT_NAME"="I"."INDEX_NAME")
       filter("O"."OBJECT_NAME"="I"."INDEX_NAME")

Oracle SQL 优化之sql tuning advisor (STA)

 

报告如上,

仔细阅读此报告,主要给出了两种建议:1.收集两张表obj与ind的统计信息;2.在这两张表上面创建相应索引。

并且特别贴心的把语句都给了出来,完全可以拿去直接运行,

更加贴心的是,报告中把优化前后的预计效果都展示了出来,完全一目了然,更加方便了DBA考虑是否进行建议优化方案。


五、删除优化任务
通过调用dbms_sqltuen.drop_tuning_task可以删除已经存在的优化任务,可以释放资源。


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

 

结语: 如上就是SQL优化器 SQL Tuning Advisor  (STA)的使用方法,可能语法有些复杂,但是确实给优化的工作带来了很大帮助,经常使用多加练习即可熟练。


您可能感兴趣的文档:

--结束END--

本文标题: Oracle SQL 优化之sql tuning advisor (STA)

本文链接: https://www.lsjlt.com/news/46782.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • mysql中describe怎么用
    mysql 中的 describe 命令用于获取表的元数据信息,包括:字段名称、数据类型、长度、是否允许空值、默认值、键。它返回一个结果集,包含有关表结构、列类型、约束和索引的详细信息。...
    99+
    2024-04-29
    mysql
  • mysql中like怎么用
    like 运算符用于 mysql 中的模式匹配,它使用通配符匹配字符序列,包括:%:匹配零个或多个字符。_:匹配单个字符。[ ]:匹配方括号内列出的任何字符。 MySQL 中 LIKE...
    99+
    2024-04-29
    mysql
  • mysql中当前日期和时间的函数
    mysql 中获取当前日期和时间的函数共有三个:1. now() 函数:返回当前日期和时间,格式为 'yyyy-mm-dd hh:mm:ss';2. curdate() 函数:返回当前日...
    99+
    2024-04-29
    mysql
  • mysql中的round函数是什么函数
    mysql 中的 round 函数用于对数字进行四舍五入,语法为 round(number, decimal_places),其中 number 为要舍入的数字,decimal_plac...
    99+
    2024-04-29
    mysql
  • mysql中double表达的意思
    mysql中的double数据类型是一种64位浮点数,用于存储高精度浮点数。特点包括:1. 精度高达15-16位有效数字;2. 取值范围为-1.7976931348623157e+308...
    99+
    2024-04-29
    mysql
  • mysql中删除列的命令
    mysql 中删除列的命令是 alter table,语法为 alter table table_name drop column column_name,可用于删除非主键列,删除前列中...
    99+
    2024-04-29
    mysql
  • mysql中删除记录的命令
    mysql 中删除记录的命令是 delete。其语法为:delete from table_name where condition;其中,table_name 是目...
    99+
    2024-04-29
    mysql 数据丢失
  • mysql中内连接,左连接和右连接的区别
    mysql 中内连接、左连接和右连接的区别在于:内连接只返回同时在两个表中匹配的行,而左连接返回左表所有行,包含匹配右表行,右连接返回右表所有行,包含匹配左表行。内连接语法:selec&...
    99+
    2024-04-29
    mysql
  • mysql中内连接查询的on后面怎么写
    inner join 后面的 on 语句用于指定用于比较和匹配表的列。语法为:on = 。其他要点:1. 运算符可替换为 >、= 和 在 MySQL 中,INNER ...
    99+
    2024-04-29
    mysql
  • mysql中replace函数的使用方法
    mysql 中的 replace() 函数用于替换字符串中的字符或子字符串,其语法为:replace(string, search_string, replace_string)。它支持...
    99+
    2024-04-29
    mysql
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作