SQL Profiles與語句最佳化

maojinyu發表於2011-06-09

個人理解SQL Profiles可以看作是SQL語句的統計資訊。只是這個統計資訊對特定SQL語句才能起作用,不對會語句的物件、其它語句產生影響。

使用SQL Profiles前要用SQL Tuning Advisor收集對語句的最佳化建議,再根據最佳化建議建立SQL Profiles

SQL Profiles 使用也比較靈活,可以在會話級、系統級應用。

語句繫結SQL Profile後,測試了下SQL ProfileBind Peeking的關係。測試發現,Bind Peeking的特性還是會起作用。這從另一方面說明SQL ProfileOUTLINE的不同:繫結OUTLINE後,執行計劃是被固化的;繫結SQL Profile後,執行計劃不是不變,而是最佳化器在執行該語句時,會參考SQL Profile中的資訊。

SQL Profiles
會收集哪些資訊?這點比較懸,沒找到特別好的解釋,不過從DBA_SQLTUNE_STATISTICS檢視中也可以看到蛛絲馬跡:

CREATE OR REPLACE VIEW DBA_SQLTUNE_STATISTICS AS

SELECT TASK_ID, OBJECT_ID, PARSING_SCHEMA_ID, MODULE, ACTION, ELAPSED_TIME,

CPU_TIME, BUFFER_GETS, DISK_READS, DIRECT_WRITES,

ROWS_PROCESSED, FETCHES, EXECUTIONS,

END_OF_FETCH_COUNT, OPTIMIZER_COST, OPTIMIZER_ENV, COMMAND_TYPE

FROM wri$_adv_sqlt_statistics;

以下是SQL Profiles的使用步驟,記錄一下,當做速查手冊:

1、建立最佳化任務:

使用SQL TEXT

DECLARE

my_task_name VARCHAR2(50);

my_sqltext CLOB;

BEGIN

my_sqltext := 'select /*+ FULL(T) */ * from t where n=:A';

my_task_name := DBMS_SQLTUNE.CREATE_TUNING_TASK(

sql_text => my_sqltext,

user_name => 'ROCKEY',

scope => 'COMPREHENSIVE',

time_limit => 60,

task_name => 'rockey_sql_tuning_task_001',

description => 'Task to tune a query on a sspecified table');

END;

/

使用SQL ID:

DECLARE

my_task_name VARCHAR2(50);

my_sql_id VARCHAR2(64);

BEGIN

my_sql_id := 'gh991ctttx3k7';

my_task_name := DBMS_SQLTUNE.CREATE_TUNING_TASK(

sql_id => my_sql_id,

scope => 'COMPREHENSIVE',

time_limit => 60,

task_name => 'rockey_sql_tuning_task_001',

description => 'Task to tune a query on a specified table');

END;

/

2、執行最佳化任務:

BEGIN

DBMS_SQLTUNE.EXECUTE_TUNING_TASK( task_name => 'rockey_sql_tuning_task_001');

end;

/

3、檢視最佳化建議:

SET WRAP ON

SET LONG 10000

SET LONGCHUNKSIZE 1000

SET LINESIZE 130

SELECT DBMS_SQLTUNE.REPORT_TUNING_TASK( 'rockey_sql_tuning_task_001') from DUAL;

或者

SELECT dbms_advisor.GET_TASK_REPORT(task_name)

FROM dba_advisor_tasks

where task_name = 'rockey_sql_tuning_task_001';

其中dbms_advisor.GET_TASK_REPORT可用於檢視ADDM REPORT

4SQL語句綁字SQL Profile

begin

dbms_sqltune.accept_sql_profile(task_name => 'rockey_sql_tuning_task_001',

name => 'my_sql_profile_001',

replace => TRUE,

force_match => true);

end;

/

5、檢視語句是否使用了SQL Profile

select sql_text, sql_id, sql_profile, executions, plan_hash_value

from v$sql

where sql_profile is not null;

6、其它常用功能:
刪除最佳化任務:

begin

dbms_sqltune.drop_tuning_task('rockey_sql_tuning_task_001');

end;

/

begin

dbms_advisor.delete_task('rockey_sql_tuning_task_001');

end;

/

刪除SQL Profile

BEGIN

DBMS_SQLTUNE.DROP_SQL_PROFILE(name => 'my_sql_profile_001');

END;

/

與最佳化任務相關的常用檢視:

select * from dba_sql_profiles;

select * from DBA_ADVISOR_TASKS;

[@more@]

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/9907339/viewspace-1050973/,如需轉載,請註明出處,否則將追究法律責任。

相關文章