Oracle 10G強大的SQL優化工具:SQL Tuning Advisor



Oracle 10G強大的SQL優化工具:SQL Tuning Advisor



20161114

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.

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM