前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >绑定运行计划sql_plan_baseline[通俗易懂]

绑定运行计划sql_plan_baseline[通俗易懂]

作者头像
全栈程序员站长
发布2022-01-24 16:49:59
4540
发布2022-01-24 16:49:59
举报

大家好,又见面了,我是全栈君。

–因为生产环境运行的sql变化较快,版本号公布比較频繁,造成sql的运行计划不是非常稳定。常常会有一些性能非常查的sql出现 –对于这些sql,我们能够使用sql_plan_baseline对运行计划进行绑定,从而使运行计划固定下来 –前提是sql最好使用绑定变量。就算有的没有绑定变量,确定字段的值不会改变才行。由于是针对sql_id进行的绑定,假设sql文本改变,绑定也就无意义了

代码语言:javascript
复制
详细步骤:
 –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’
–完毕 

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/116257.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档