存储大纲(STORED OUTLINE)和 SQL PLAN BASELINE不支持并行(parallel)的控制

时间:2022-05-15 08:02:29

      最近希望通过稳定执行计划来达到改变一个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