SQL Tuning Advisor(SQL調優顧問,STA)

SQL調優顧問需要一個或多個SQL語句作爲輸入,並調用自動優化器執行SQL調優。SQL調優顧問輸出是以一種意見或者建議的形式,以及對每一項建議和期望效益的理由。該建議涉及對象的統計收集新索引的創建SQL語句的重組,或SQL概要的創建。你可以選擇該建議來完成SQL語句的調優。

Oracle數據庫可以自動優化有問題的SQL語句,並使用SQL調優顧問實現調優建議。也可以手動運行SQL調優顧問選擇單個SQL語句或者一個SQL語句集來完成SQL語句調優。

一般使用的比較多的是手動SQL調優顧問,因此也重點介紹手動SQL調優顧問。

 

1.自動SQL調優顧問

1.1啓用自動SQL調優

begin
  dbms_auto_task_admin.enable(client_name => 'sql tuning advisor',
                              operation   => null,
                              window_name => null);
end;

1.2失效自動SQL調優

begin
  dbms_auto_task_admin.disable(client_name => 'sql tuning advisor',
                               operation   => null,
                               window_name => null);
end;

 

1.3查看自動SQL調優報表

create  table a (a1 clob);

declare
  my_rept clob;
begin
  my_rept := dbms_sqltune.report_auto_tuning_task(begin_exec   => null,
                                                  end_exec     => null,
                                                  type         => 'TEXT',
                                                  level        => 'TYPICAL',
                                                  section      => 'ALL',
                                                  object_id    => null,
                                                  result_limit => null);

  insert into a values (my_rept);
end;

select * from a;

 

截取報告片段:

FINDINGS SECTION (3 findings)
-------------------------------------------------------------------------------

1- Statistics Finding
---------------------
  表 "SYS"."OBJAUTH$" 及其索引的優化程序統計信息已失效。

  Recommendation
  --------------
  - 考慮收集此表的優化程序統計信息。
    execute dbms_stats.gather_table_stats(ownname => 'SYS', tabname =>
            'OBJAUTH$', estimate_percent => DBMS_STATS.AUTO_SAMPLE_SIZE,
            method_opt => 'FOR ALL COLUMNS SIZE AUTO');

  Rationale
  ---------
    爲了選擇好的執行計劃, 優化程序需要此表的最新統計信息。

 

2.手動SQL調優顧問

SQL調優顧問可以按照需求手動調用一個或者多個SQL語句。要調用多條SQL語句,需要創建一個SQL調優集(STS)。SQL調優集是一個存儲SQL語句以及執行上下文的數據庫對象。

使用DBMS_SQLTUNE包運行SQL調優顧問,需要一下幾個步驟:

  1. 創建SQL調優集(如果調優多個SQL語句)
  2. 創建SQL調優任務
  3. 執行優化SQL調優任務
  4. 顯示SQL調優任務結果
  5. 實現適當的建議

一個SQL調優任務可以爲單個SQL語句創建。對於多個SQL語句,需要先創建SQL調優集(STS)。具體步驟如下:

 

爲了找出有問題的SQL語句,需要創建創建一張沒有任何所有的表。如下:

create table my_objects as select * from dba_objects;

查詢EMP對象的SQL語句

select * from my_objects o where o.object_name='EMP';

my_objects表上沒有任何創建索引,因此該查詢語句肯定是有問題的,接下來使用SQL調優顧問來優化該SQL語句:

 

2.1.創建SQL調優任務

declare
  v_my_task_name varchar2(50);
  v_my_sql_text  clob;
begin
  v_my_sql_text := 'select * from my_objects o where o.object_name=:bin';

  v_my_task_name := dbms_sqltune.create_tuning_task(sql_text    => v_my_sql_text,
                                                    bind_list   => sql_binds(anydata.convertvarchar2('EMP')),
                                                    user_name   => 'GDSHEC',
                                                    scope       => 'COMPREHENSIVE',
                                                    time_limit  => 60,
                                                    task_name   => 'my_sql_tuning_task',
                                                    description => 'Task to tune a query on a specified  ');

end;

 

2.2.配置SQL調優任務

begin
  dbms_sqltune.set_tuning_task_parameter(task_name => 'my_sql_tuning_task',
                                         parameter => 'TIME_LIMIT',
                                         value     => 300);
end;

 

2.3.執行SQL調優任務

begin
  dbms_sqltune.execute_tuning_task(task_name => 'my_sql_tuning_task');
end;

 

2.4.檢查SQL調優任務狀態

select * from dba_advisor_tasks t where t.task_name = 'my_sql_tuning_task';

2.5.顯示SQL調優任務結果

select dbms_sqltune.report_tuning_task(task_name => 'my_sql_tuning_task')
  from dual;

 

優化結果報告:

GENERAL INFORMATION SECTION
-------------------------------------------------------------------------------
Tuning Task Name   : my_sql_tuning_task
Tuning Task Owner  : GDSHEC
Workload Type      : Single SQL Statement
Scope              : COMPREHENSIVE
Time Limit(seconds): 300
Completion Status  : COMPLETED
Started at         : 12/05/2013 16:10:32
Completed at       : 12/05/2013 16:10:34

-------------------------------------------------------------------------------
Schema Name: GDSHEC
SQL ID     : 14suc19101mgf
SQL Text   : select * from my_objects o where o.object_name=:bin

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

1- Index Finding (see explain plans section below)
--------------------------------------------------
  通過創建一個或多個索引可以改進此語句的執行計劃。

  Recommendation (estimated benefit: 98.73%)
  ------------------------------------------
  - 考慮運行可以改進物理方案設計的訪問指導或者創建推薦的索引。
    create index GDSHEC.IDX$$_02290001 on GDSHEC.MY_OBJECTS("OBJECT_NAME");

  Rationale
  ---------
    創建推薦的索引可以顯著地改進此語句的執行計劃。但是, 使用典型的 SQL 工作量運行 "訪問指導"
    可能比單個語句更可取。通過這種方法可以獲得全面的索引建議案, 包括計算索引維護的開銷和附加的空間消耗。

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

1- Original
-----------
Plan hash value: 880823944

--------------------------------------------------------------------------------
| Id  | Operation         | Name       | Rows  | Bytes | Cost (%CPU)| Time     |
--------------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |            |     2 |   194 |   317   (1)| 00:00:04 |
|*  1 |  TABLE ACCESS FULL| MY_OBJECTS |     2 |   194 |   317   (1)| 00:00:04 |
--------------------------------------------------------------------------------
 
Predicate Information (identified by operation id):
---------------------------------------------------
 
   1 - filter("O"."OBJECT_NAME"=:BIN)

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

----------------------------------------------------------------------------------------------
| Id  | Operation                   | Name           | Rows  | Bytes | Cost (%CPU)| Time     |
----------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT            |                |     2 |   194 |     4   (0)| 00:00:01 |
|   1 |  TABLE ACCESS BY INDEX ROWID| MY_OBJECTS     |     2 |   194 |     4   (0)| 00:00:01 |
|*  2 |   INDEX RANGE SCAN          | IDX$$_02290001 |     2 |       |     3   (0)| 00:00:01 |
----------------------------------------------------------------------------------------------
 
Predicate Information (identified by operation id):
---------------------------------------------------
 
   2 - access("O"."OBJECT_NAME"=:BIN)

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

 

總結:SQL調優顧問發現一個問題,建議在OBJECT_NAME表的MY_OBJECTS字段上創建索引。並對照創建索引前後的執行計劃進行對比。

 

2.6刪除SQL調優任務

begin
  dbms_sqltune.drop_tuning_task(task_name => 'my_sql_tuning_task');
end;

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章