【轉】Oracle調整顧問(SQL Tuning Advisor 與 SQL Access Advisor )

 

Oracle數據庫出現性能問題時,使用Oracle自己的工具包,給出合理的調優建議是比較省力的作法。html

下面兩種包的介紹及具體作法。java

SQL Tuning Advisor 粒度最小的調整工具.sql

將一條或多條SQL語句作爲輸入內容,分析全部訪問路徑,而後生成改進SQL語句的建議,並提出索引,物化視圖和分區方案來提升應用程序的整體性能。
另外,在維護窗口中,Oracle也會針對Automatic Workload Repository(AWR) 來肯定和記錄的高負載語句自動化運行SQL Tuning Advisor
SQL Access Advisor 
它涉及工做量中全部SQL語句,並提出索引,特化視圖和分區方案來提升應用程序的整體性能。數據庫

小區別:oracle

SQL Tuning Advisor 分別調整每條SQL語句
SQL Access Advisor 同時調整全部SQL語句工具

SQL Tuning Advisor :性能

1. 在匿名PL/SQL塊中,爲SQL 語句定義調整任務。ui

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
declare
     tune_task_name varchar2( 30 )     ;
     bad_sql_stmt clob;
begin
     bad_sql_stmt := 'select distinct id from demo.txcl' ;
     tune_task_name := dbms_sqltune.create_tuning_task
         ( sql_text => bad_sql_stmt,
           user_name => 'DEMO' ,
           scope => 'COMPREHENSIVE' ,
           time_limit => 60 ,
           task_name => 'xcl_sql_tuing_task' ,
           description => 'See what is wrong with the SELECT'
             ) ;
end;
/

2. 設置任務時指定的時限值是60分鐘.spa

?
1
2
3
4
5
6
7
8
begin
     dbms_sqltune.set_tuning_task_parameter
         (task_name => 'xcl_sql_tuing_task' ,
          parameter => 'TIME_LIMIT' ,
          value => 30
          );
end;
/

3. 使用EXECUTE_TUNING_TASK過程啓動調整任務.net

?
1
2
3
4
5
begin
     dbms_sqltune.execute_tuning_task
      (task_name => 'xcl_sql_tuing_task' );
end;
/

4. 經過鏈接DBA_ADVISOR_TASKS和V$ADVISOR_PROGRESS來查任務狀態
select task_name,status,sofar,totalwork 

?
1
2
3
from dba_advisor_tasks 
join v$advisor_progress using(task_id)
where task_name = 'xcl_sql_tuing_task' ;

5. 查看調整任務給出的建議

?
1
select dbms_sqltune.report_tuning_task( 'xcl_sql_tuing_task' ) from dual;

SQL Access Advisor:

 

使用 dbms_advisor.quick_tune來對單個SQL語句進行調整
它的執行很像SQL Tuning Advisor,但執行的分析層次卻深刻得多,生成的建議也更多。

1. 指定一個存放輸出文件的目錄

?
1
2
--輸出文件目錄
create directory tune_scripts as '/demo/tune_scripts' ;

2.採集,分析並給出建議

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
declare
     v_task_name VARCHAR2( 255 );
     v_sql_stmt  VARCHAR2( 4000 );
 
     v_tune_sql_filename VARCHAR2( 255 );
     v_cfile_directory VARCHAR2( 255 );
begin
     v_sql_stmt := 'select  * from  demo.txcl t where t.id = :1 ' ;
     v_task_name := 'tune_demo_txcl' ;
 
     v_tune_sql_filename :=  'tune_demo_txcl.sql' ;
     v_cfile_directory := 'TUNE_SCRIPTS' ;
 
     dbms_stats.gather_table_stats(
         ownname => 'DEMO' ,
         tabname => 'TXCL' ,
         cascade => true );
     
     --dbms_advisor.reset_task(v_task_name);
 
     --分析並獲得建議
     dbms_advisor.quick_tune(DBMS_ADVISOR.SQLACCESS_ADVISOR,
                 v_task_name,
                 v_sql_stmt);
 
     --將建議輸出到指定文件中
     -- select * from dba_advisor_actions where task_name = 'tune_demo_txcl' ;
     -- select * user_advisor_sqla_wk_stmts where task_name = 'tune_demo_txcl'  ;
     dbms_advisor.create_file(
         dbms_advisor.get_task_script(v_task_name),
         v_cfile_directory,
         v_tune_sql_filename
         );
 
 
     --刪除任務
     dbms_advisor.delete_task(v_task_name); 
 
exception
     when others then
         dbms_output.put_line(sqlerrm);
end;
/

常見錯誤:

ORA-13600: error encountered in Advisor

QSM-00794: the statement can not be stored due to a violation of the invalid table reference filter

緣由是dbms_advisor.quick_tune不支持爲SYS和SYSTEM兩個用戶的表的顧問功能,所能要分析的表不要用這兩個用戶建。

官網相關文檔: https://docs.oracle.com/cd/E11882_01/server.112/e16638/advisor.htm#PFGRF94881

MAIL:xcl_168@aliyun.com

BLOG:https://blog.csdn.net/xcl168

相關文章
相關標籤/搜索