Oracle 10G強大的SQL優化工具:SQL Tuning Advisor
2016年11月14日
15:05
Oracle 10G推出了強大的SQL優化工具:SQL Tuning Advisor,使用該功能必須保證優化器是CBO模式,對SQL進行優化需要執行DBMS_SQLTUNE包,因而需要advisor權限。
舉個例子介紹如何優化一條發現問題的語句
--1.創建測試環境
SQL> show user;
USER is "SYS"
--授予普通用戶advisor的權限 SQL> grant advisor to owner;
Grant succeeded.
SQL> conn owner/owner
Connected.
SQL> create table test1114 as select * from dba_objects;
SQL> insert into test1114 select * from dba_objects;
SQL> set timing on SQL> set autot on
SQL> select * from test1114;
Elapsed: 00:01:09.81
Execution Plan ---------------------------------------------------------- Plan hash value: 3447467757
------------------------------------------------------------------------------ | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | ------------------------------------------------------------------------------ | 0 | SELECT STATEMENT | | 110K| 21M| 588 (1)| 00:00:08 | | 1 | TABLE ACCESS FULL| TEST1114 | 110K| 21M| 588 (1)| 00:00:08 | ------------------------------------------------------------------------------
Note ----- - dynamic sampling used for this statement (level=2)
Statistics ---------------------------------------------------------- 29 recursive calls 1 db block gets 11646 consistent gets 1080 physical reads 176 redo size 16498937 bytes sent via SQL*Net to client 106046 bytes received via SQL*Net from client 9595 SQL*Net roundtrips to/from client 0 sorts (memory) 0 sorts (disk) 143898 rows processed |
--2.創建優化任務
步驟一: 調用函數CREATE_TUNING_TASK來創建優化任務; 步驟二: 調用存儲過程EXECUTE_TUNING_TASK執行該任務;
SQL>set autotrace off SQL>set timing off
SQL> declare owner_sql varchar2(30); sqltext_me clob;
begin
sqltext_me := 'select * from test1114';
--刪除優化任務 dbms_sqltune.drop_tuning_task(task_name =>'tuning_owner_test');
--創建優化任務 owner_sql := dbms_sqltune.create_tuning_task ( sql_text => sqltext_me, user_name => 'OWNER', scope => 'comprehensive', time_limit => 60, task_name => 'tuning_owner_test', description => 'task to tune a query on a specified table') ;
--執行優化任務 dbms_sqltune.execute_tuning_task( task_name => 'tuning_owner_test'); end; /
PL/SQL procedure successfully completed. |
--3.執行優化任務
調用dbms_sqltune.execute_tuning_task過程來執行前面創建好的優化任務。
SQL> exec dbms_sqltune.execute_tuning_task('tuning_owner_test');
PL/SQL procedure successfully completed. |
--4.檢查優化任務的狀態
-通過查看dba_advisor_task或者suser_advisor_tasks可以檢查優化任務的狀態
SQL> SELECT task_name,status FROM USER_ADVISOR_TASKS WHERE task_name ='tuning_owner_test';
TASK_NAME STATUS ------------------------------ ----------- tuning_owner_test COMPLETED |
--5.查看優化結果
查詢dbms_sqltune.report_tning_task函數可以獲得優化任務的結果
SQL> set long 888888 SQL> set serveroutput on size 888888 SQL> set lines 100
SQL> select dbms_sqltune.report_tuning_task('tuning_owner_test') from dual;
DBMS_SQLTUNE.REPORT_TUNING_TASK('TUNING_OWNER_TEST1500') -------------------------------------------------------------------------------- GENERAL INFORMATION SECTION ------------------------------------------------------------------------------- Tuning Task Name : tuning_owner_test1500 Tuning Task Owner : OWNER Workload Type : Single SQL Statement Execution Count : 2 Current Execution : EXEC_146 Execution Type : TUNE SQL Scope : COMPREHENSIVE Time Limit(seconds): 60 Completion Status : COMPLETED Started at : 11/14/2016 15:00:36 Completed at : 11/14/2016 15:00:37
------------------------------------------------------------------------------- Schema Name: OWNER SQL ID : dzrzmbsu9krk8 SQL Text : select * from test1114
------------------------------------------------------------------------------- FINDINGS SECTION (1 finding) -------------------------------------------------------------------------------
1- Statistics Finding --------------------- Table "OWNER"."TEST1114" was not analyzed.
Recommendation -------------- - Consider collecting optimizer statistics for this table. execute dbms_stats.gather_table_stats(ownname => 'OWNER', tabname => 'TEST1114', estimate_percent => DBMS_STATS.AUTO_SAMPLE_SIZE, method_opt => 'FOR ALL COLUMNS SIZE AUTO');
Rationale --------- The optimizer requires up-to-date statistics for the table in order to select a good execution plan.
------------------------------------------------------------------------------- EXPLAIN PLANS SECTION -------------------------------------------------------------------------------
1- Original ----------- Plan hash value: 3447467757
------------------------------------------------------------------------------ | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | ------------------------------------------------------------------------------ | 0 | SELECT STATEMENT | | 139K| 27M| 588 (1)| 00:00:08 | | 1 | TABLE ACCESS FULL| TEST1114 | 139K| 27M| 588 (1)| 00:00:08 | ------------------------------------------------------------------------------
------------------------------------------------------------------------------- 分析語句為
execute dbms_stats.gather_table_stats(ownname => 'OWNER', tabname => 'TEST1114', estimate_percent => DBMS_STATS.AUTO_SAMPLE_SIZE, method_opt => 'FOR ALL COLUMNS SIZE AUTO');
|
--6.刪除優化任務
調用dbms_sqltuen.drop_tuning_task刪除已經存在的優化任務
SQL> exec dbms_sqltune.drop_tuning_task('tuning_kingsql_test1500');
PL/SQL procedure successfully completed. |