oracle穩定執行計划(更改)的方法


應用於那些執行計划已經發生了的不好的變更的SQL上(在不改變SQL文本的情況下,改變其執行計划),即便通過創建SQL Profile解決了目標SQL執行計划變更的問題,依然不能保證系統后續執行的SQL的執行計划會發生不好的變更。
a. Automatic類型的SQL Profile
1、先針對SQL創建一個名為my_sql_tuning_task_1的自動調整任務:
declare
my_task_name varchar2(30);
my_sqltext clob;
begin
my_sqltext := '目標SQL';
my_task_name := dbms_sqltune.create_tuning_task(
sql_text => my_sqltext,
user_name => 'SCOTT',
scope => 'COMPREHENSIVE',
time_limit => 60,
task_name => my_task_name,
description => 'Task to tune a query on table t1');
end;
/
2、接着執行上述自動調整任務
begin
dbms_sqltune.execute_tuning_task(task_name => 'my_sql_tuning_task_1');
end;
/
3、然后使用dbms_sqltune.report_tuning_task來查看上述自動調整任務的調整結果
SET LONG 9000
SET LONGCHUNKSIZE 1000
SET LINESIZE 800
select dbms_sqltune.report_tuning_task('my_sql_tuning_task_1') from dual;
4、上述Automatic類型的SQL Profile所產生的調整結果如果是我們想要的,只需要按Oracle的提示接受這個SQL Profile
execute dbms_sqltune.accept_sql_profile(task_name => 'my_sql_tuning_task_1', task_owner => 'SCOTT',replace => TRUE, fore_match => true)
備注:這里fore_match的值設為true的含義,是指即使目標SQL的where條件中具體的輸入值發生了改變(比如n=1變為n=2),原SQL Profile依然有效,這就相當於將目標SQL的where條件中具體的輸入值用綁定變量替換了。

b. Manual 類型的SQL Profile(一堆Hint的組合)
同樣可以在不該SQL文本的情況下,改變其執行計划。更重要的是,Manual類型的SQL Profile可以起到很好的穩定目標SQL的執行計划的作用,這一點是Automatic類型的SQL Profile所不具備的。
我們使用腳本 coe_xfr_sql_profile.sql 可以針對目標SQL生成Manual類型的SQL Profile,並且通過“偷梁換柱”的方式在不修改目標SQL文本的情況下調整其執行計划。
1、改寫SQL文本,在其中加入合適的Hint,走出我們想要的執行計划
2、查詢出原目標SQL和改寫后的SQL所對應的SQL ID 和 PLAN HASH VALUE
select sql_text,sql_id,version_count from v$sqlarea where sql_text like 'SQL文本';
3、針對目標SQL使用腳本 coe_xfr_sql_profile.sql 產生能生成其Manual類型的SQL Profile的腳本A (傳入相應的SQL ID 和 PLAN HASH VALUE)
4、對加入合適Hint后的SQL使用腳本 coe_xfr_sql_profile.sql 產生能生成其Manual類型的SQL Profile腳本B (傳入相應的SQL ID 和 PLAN HASH VALUE)
5、用腳本B中Outline Data部分的Hint組合替換掉腳本A中的Outline Data部分的Hint組合。(注意將參數force_match改為force_match => TRUE)
6、執行腳本A生成針對原目標SQL的Manual類型SQL Profile.


免責聲明!

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



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