1. 程式人生 > >轉://綁定執行計劃sql_plan_baseline

轉://綁定執行計劃sql_plan_baseline

cost 出現 計劃 變化 新的 進行 optimizer origin 檢查

--由於生產環境執行的sql變化較快,版本發布比較頻繁,造成sql的執行計劃不是很穩定,經常會有一些性能很查的sql出現
--對於這些sql,我們可以使用sql_plan_baseline對執行計劃進行綁定,從而使執行計劃固定下來
--前提是sql最好使用綁定變量,就算有的沒有綁定變量,確定字段的值不會改變才行,因為是針對sql_id進行的綁定,如果sql文本改變,綁定也就無意義了
具體步驟:
--1、找到問題sql,如果查詢sql的執行計劃,如果有合適的執行計劃,直接進行綁定
--查詢sql執行計劃對應的PLAN_HASH_VALUE
SELECT DISTINCT(PLAN_HASH_VALUE) FROM V$SQL_PLAN t WHERE SQL_ID = ‘010cv4dvf6swv‘ and child_number=‘0‘
--綁定好的執行計劃:
declare
l_pls number;
begin
l_pls := DBMS_SPM.LOAD_PLANS_FROM_CURSOR_CACHE(sql_id => ‘524wzct86gu1d‘,
plan_hash_value => 2554538542,
enabled => ‘YES‘);
end;
/
2、如果沒有合適的執行計劃,就要通過自己分析,運用一些hint讓sql產生比較好的執行計劃
--需要綁定的sql
--oldSQL(id PLAN_HASH_VALUE)
524wzct86gu1d
2554538542
--新的sql
--newSQL(id PLAN_HASH_VALUE)
010cv4dvf6swv
756701203
--查詢新的執行計劃的sql_id
select * from v$sql where sql_text like ‘%zhruoyu%‘ --通過在hint中加一下特殊字符來查找
---新建制定SQLID的BASELINE根據old_sql id,PLAN_HASH_VALUE
declare
l_pls number;
begin
l_pls := DBMS_SPM.LOAD_PLANS_FROM_CURSOR_CACHE(sql_id => ‘524wzct86gu1d‘,
plan_hash_value => 2554538542,
enabled => ‘NO‘); --註意這裏是no
end;
/
---確定原始執行計劃的 sql_handle
select sql_handle, plan_name, origin, enabled, accepted,fixed,creator,optimizer_cost,sql_text
from dba_sql_plan_baselines where origin = ‘MANUAL-LOAD‘ order by created desc
SQL_HANDLE:SQL_66108ad9595208fc
PLAN_NAME:SQL_PLAN_6c44av5cp427w65e519aa
---與正確的執行計劃做關聯
declare
l_pls number;
begin
l_pls := DBMS_SPM.load_plans_from_cursor_cache(sql_id => ‘010cv4dvf6swv‘, -- new_SQL_ID‘
plan_hash_value => 756701203, --new_plan_hash_value
sql_handle => ‘SQL_66108ad9595208fc‘ --OLD_handle
);
end;
/
---刪除錯誤的執行計劃
declare
l_pls number;
begin
l_pls := DBMS_SPM.DROP_SQL_PLAN_BASELINE(sql_handle => ‘SQL_66108ad9595208fc‘, --sql_handle_for_original
plan_name => ‘SQL_PLAN_6c44av5cp427w65e519aa‘ --sql_plan_name_for_original
);
end;
/
--檢查一下
select sql_handle, plan_name, origin, enabled, accepted,fixed,creator,optimizer_cost,sql_text
from dba_sql_plan_baselines where origin = ‘MANUAL-LOAD‘ and sql_handle=‘SQL_66108ad9595208fc‘
--完成

轉://綁定執行計劃sql_plan_baseline