zoukankan      html  css  js  c++  java
  • SQL Tuning 基础概述08

    SQL调优顾问 SQL Tuning Advisor的使用案例:

    1.构建测试表T

    SQL> conn zjy/zjy
    Connected.
    SQL> create table t as select * from dba_objects;
    
    Table created.
    SQL> select count(*) from t;
    
    COUNT(*)
    ----------
    653500

    2.定义调整任务

    对“select owner, object_id, object_name from t where object_id=200000”这个sql定义调整任务:

    declare 
    tune_task_name varchar2(30);
    bad_sql_stmt clob;
    begin
     bad_sql_stmt := '';
     tune_task_name := dbms_sqltune.create_tuning_task
     (sql_text => bad_sql_stmt,
     user_name => 'ZJY',
     scope => 'COMPREHENSIVE',
     time_limit => 3600,
     task_name => 'zjy_sql_tuning_task',
     description => 'sql_tuning_advisor for this sql'
     ); 
    end;
    /
    SQL> declare 
    2 tune_task_name varchar2(30);
    3 bad_sql_stmt clob;
    4 begin
    5 bad_sql_stmt := 'select owner, object_id, object_name from t where object_id=200000';
    6 tune_task_name := dbms_sqltune.create_tuning_task
    7 (sql_text => bad_sql_stmt,
    8 user_name => 'ZJY',
    9 scope => 'COMPREHENSIVE',
    10 time_limit => 3600,
    11 task_name => 'zjy_sql_tuning_task',
    12 description => 'sql_tuning_advisor for this sql'
    13 ); 
    14 end;
    15 /
    
    PL/SQL procedure successfully completed.

    3.修改调整任务参数

    可以修改调整任务的一些参数,比如:

    SQL> begin
    2 dbms_sqltune.set_tuning_task_parameter
    3 (task_name => 'zjy_sql_tuning_task',
    4 parameter => 'TIME_LIMIT', value => 1800
    5 );
    6 end;
    7 /
    
    PL/SQL procedure successfully completed.

    4.执行调整任务

    开始执行调整任务:

    begin
     dbms_sqltune.execute_tuning_task
     (task_name => 'zjy_sql_tuning_task');
    end;
    /
    SQL> begin
    2 dbms_sqltune.execute_tuning_task
    3 (task_name => 'zjy_sql_tuning_task');
    4 end;
    5 /
    
    PL/SQL procedure successfully completed.

    5.监控调整任务

    监控调整任务的执行状态:

    select task_name, status, sofar, totalwork
     from dba_advisor_tasks
     join v$advisor_progress using(task_id)
     where task_name = 'zjy_sql_tuning_task';
    SQL> select task_name, status, sofar, totalwork
    2 from dba_advisor_tasks
    3 join v$advisor_progress using(task_id)
    4 where task_name = 'zjy_sql_tuning_task';
    
    TASK_NAME STATUS SOFAR TOTALWORK
    ------------------------------ ----------- ---------- ----------
    zjy_sql_tuning_task COMPLETED 1 1

    6.查看调整任务建议

    查看调整任务最终给出的建议:

    SQL> select dbms_sqltune.report_tuning_task('zjy_sql_tuning_task') from dual;
    
    DBMS_SQLTUNE.REPORT_TUNING_TASK('ZJY_SQL_TUNING_TASK')
    -------------------------------------------------------------------------------
    GENERAL INFORMATION SECTION
    -------------------------------------------------------------------------------
    Tuning Task Name : zjy_sql_tuning_task
    Tuning Task Owner : ZJY
    Workload Type : Single SQL Statement
    Scope : COMPREHENSIVE
    Time Limit(seconds): 1800
    Completion Status : COMPLETED
    Started at : 01/23/2015 14:58:40
    Completed at : 01/23/2015 14:58:58
    
    -------------------------------------------------------------------------------
    Schema Name: ZJY
    SQL ID : dmw0nx6g0b6h7
    SQL Text : select owner, object_id, object_name from t where
    object_id=200000
    
    -------------------------------------------------------------------------------
    FINDINGS SECTION (2 findings)
    -------------------------------------------------------------------------------
    
    1- Statistics Finding
    ---------------------
    尚未分析表 "ZJY"."T"。
    
    Recommendation
    --------------
    - 考虑收集此表的优化程序统计信息。
    execute dbms_stats.gather_table_stats(ownname => 'ZJY', tabname => 'T',
    estimate_percent => DBMS_STATS.AUTO_SAMPLE_SIZE, method_opt =>
    'FOR ALL COLUMNS SIZE AUTO');
    
    Rationale
    ---------
    为了选择好的执行计划, 优化程序需要此表的最新统计信息。
    
    2- Index Finding (see explain plans section below)
    --------------------------------------------------
    通过创建一个或多个索引可以改进此语句的执行计划。
    
    Recommendation (estimated benefit: 99.86%)
    ------------------------------------------
    - 考虑运行可以改进物理方案设计的访问指导或者创建推荐的索引。
    create index ZJY.IDX$$_3EC90001 on ZJY.T("OBJECT_ID","OWNER","OBJECT_NAME")
    ;
    
    Rationale
    ---------
    创建推荐的索引可以显著地改进此语句的执行计划。但是, 使用典型的 SQL 工作量运行 "访问指导"
    可能比单个语句更可取。通过这种方法可以获得全面的索引建议案, 包括计算索引维护的开销和附加的空间消耗。
    
    -------------------------------------------------------------------------------
    EXPLAIN PLANS SECTION
    -------------------------------------------------------------------------------
    
    1- Original
    -----------
    Plan hash value: 1601196873
    
    --------------------------------------------------------------------------
    | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
    --------------------------------------------------------------------------
    | 0 | SELECT STATEMENT | | 124 | 11904 | 3059 (1)| 00:00:37 |
    |* 1 | TABLE ACCESS FULL| T | 124 | 11904 | 3059 (1)| 00:00:37 |
    --------------------------------------------------------------------------
    
    Predicate Information (identified by operation id):
    ---------------------------------------------------
    
    1 - filter("OBJECT_ID"=200000)
    
    2- Using New Indices
    --------------------
    Plan hash value: 3141638344
    
    -----------------------------------------------------------------------------------
    | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
    -----------------------------------------------------------------------------------
    | 0 | SELECT STATEMENT | | 1 | 96 | 4 (0)| 00:00:01 |
    |* 1 | INDEX RANGE SCAN| IDX$$_3EC90001 | 1 | 96 | 4 (0)| 00:00:01 |
    -----------------------------------------------------------------------------------
    
    Predicate Information (identified by operation id):
    ---------------------------------------------------
    
    1 - access("OBJECT_ID"=200000)
    
    -------------------------------------------------------------------------------

    7.删除调整任务

    删除调整任务:

    SQL> exec dbms_sqltune.drop_tuning_task('zjy_sql_tuning_task') ;
    
    PL/SQL procedure successfully completed.
  • 相关阅读:
    力扣516题、72题、1312题(最长回文子序列,编辑距离,构造回文串)
    力扣53题、1143题(最大子数组问题、最长公共子序列)
    力扣704题、34题(二分查找)
    力扣300题、354题(最长递增子序列,信封嵌套)
    力扣509题、70题(斐波那契数列、爬楼梯)
    力扣206题、92题、25题(反转链表)
    力扣234题(回文链表)
    力扣239题(单调队列)
    力扣496题、503题(单调栈)
    面试题简答题
  • 原文地址:https://www.cnblogs.com/jyzhao/p/3930567.html
Copyright © 2011-2022 走看看