最近希望通过稳定执行计划来达到改变一个SQL的执行计划从并行执行到正常执行,用STORED OUTLINE和SQL PLAN BASELINE实验了好多遍,始终不能达到目的,最后发现无论是STORED OUTLINE还是SQL PLAN BASELINE对于并行都不能控制,是否并行完全由优化器决定。做个记录,欢迎大家参考验证。
一.STORED OUTLINE修改执行计划(增加提示hint)
创建原有sql的outline
创建仅添加HINT后的SQL的OUTLINE
UPDATE OUTLN.OL$ SET HINT_COUNT=XX WHERE OL_NAME='ORIGINAL_OL'
UPDAET OUTLN.OL$HINTS SET OL_NAME=DECODE(OL_NAME,'ORIGINAL_OL','NEW_OL',,'NEW_OL','ORIGINAL_OL')
二.SQL BASELINE修改执行计划(增加提示hint)
假设数据库SHARED POOL中已经有两个版本的执行计划
1。创建旧执行计划的SQL PLAN BASELINE
DBMS_SPM.LOAD_PLANS_FROM_CURSOR_CACHE( sql_id => 'old_sql_id',plan_hash_value=>'xxxx');
2。加载新的执行计划,这里需要用第一步生成的SQL_HANDLE标示这个计划适用于旧的SQL
DBMS_SPM.LOAD_PLANS_FROM_CURSOR_CACHE(
sql_id => 'new_sql_id',
plan_hash_value=>'xxxx'
sql_handle=>'第一步生成的SQL BASELINE对应的SQL_HANDLE');
3。使用DBMS_SPM.DROP_SQL_PLAN_BASELINE删除掉多余的BASELINE