博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
绑定运行计划sql_plan_baseline
阅读量:6689 次
发布时间:2019-06-25

本文共 1975 字,大约阅读时间需要 6 分钟。

--因为生产环境运行的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'

--完毕

转载地址:http://obhao.baihongyu.com/

你可能感兴趣的文章
oracle优化:避免全表扫描(高水位线)
查看>>
对超级课程表产品的一些个人小看法
查看>>
词频统计 效能分析
查看>>
Linux终极shell-zsh的完美配置方案!——oh-my-zsh
查看>>
MYSQL 函数、自定义函数 function
查看>>
Python爬虫之简单爬虫框架实现
查看>>
python isinstance内建函数的使用
查看>>
老师不能把你怎样,但外面的世界可以!
查看>>
css居中div的几种常用方法
查看>>
css3
查看>>
根据某个元素做相对定位
查看>>
C# Window编程随记——ClickOnce程序部署
查看>>
小白系列-免费广告路由器web认证设置(2)
查看>>
Top 16 Java 应用类 - 这些功能再也不用自己写了
查看>>
面试题之矩阵与转置矩阵相乘
查看>>
linux光盘、U盘的挂载与卸载
查看>>
linux sudo命令
查看>>
LeetCode-最长回文子串
查看>>
Silverlight 动态创建Enum
查看>>
TCP之send函数研究
查看>>