前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >SPM手动绑定执行计划一例

SPM手动绑定执行计划一例

原创
作者头像
laosu
修改2021-10-15 18:10:00
6130
修改2021-10-15 18:10:00
举报
文章被收录于专栏:db小强

背景

oracle 11.2.0.4

原sql A不走索引, select /*+ no_index(t1 idx_01)*/ from t1 where object_id=5;

手动生成走索引的SQL B的执行计划,select /*+ index(t1 idx_01)*/ from t1 where object_id=5;

将B的执行计划绑定到A,使SQL A走索引。

详细步骤

查看sql A 的SQL_ID和PLAN_HASH_VALUE

代码语言:javascript
复制
--从v$sql 视图查询 
select sql_id,plan_hash_value,sql_text,parse_calls,executions 
from v$sql 
where sql_text like 'select /*+ no_index(t1 idx_01)*%';
--或sqlplus中,执行完sql后执行
select * from table(dbms_xplan.display_cursor(null,null,'advanced'));  

创建sql A的baseline,生成sql_handle

代码语言:javascript
复制
declare
tmp number;
begin
tmp := DBMS_SPM.LOAD_PLANS_FROM_CURSOR_CACHE(sql_id => 'g3auf3vcmtr6z',plan_hash_value => 3910739905,enabled => 'NO'); 
end;
/

查看baseline,A的sql_handle

代码语言:javascript
复制
select sql_handle,plan_name,origin,enabled,accepted,sql_text 
from dba_sql_plan_baselines 
where sql_text like 'select /*+ no_index(t1 idx_01)*/%';

生成需要的sql B的执行计划

代码语言:javascript
复制
执行多次如下SQL
select /*+ index(t1 idx_01)*/ from t1 where object_id=5;
获取SQL B的sql id 和plan_hash value,同上如下两种方式都可以
select * from table(dbms_xplan.display_cursor(null,null,'advanced'));
select sql_id,plan_hash_value,sql_text,parse_calls,executions 
from v$sql 
where sql_text like 'select /*+ index(t1 idx_01)*%';

将sql A的sql_handle与B的执行计划关联

代码语言:javascript
复制
declare
tmp number;
begin
tmp := DBMS_SPM.load_plans_from_cursor_cache(sql_id => 'fsfyjhcrv6kwb', -- new sql_id ,sql B
plan_hash_value => 34099177, --new plan_hash_value, sql B
sql_handle => 'SQL_4fd8b0b98686fd73' --原sql的sql_handle, sql A
);
end;
/
或:
exec :tmp :=dbms_spm.load_plans_from_cursor_cache(sql_id=>'fsfyjhcrv6kwb',plan_hash_value=>34099177,sql_handle=>'SQL_4fd8b0b98686fd73');

查看sql_handle,并删除原执行计划

代码语言:javascript
复制
--查看原SQL handle的执行计划
select sql_handle,plan_name,origin,enabled,accepted,sql_text 
from dba_sql_plan_baselines 
where sql_handle='SQL_4fd8b0b98686fd73';
--查看baseline sql_handle执行计划内容
select * from table(dbms_xplan.display_sql_plan_baseline(sql_handle=>'SQL_4fd8b0b98686fd73',plan_name=>'SQL_PLAN_4zq5hr638dzbmd147f332'));
--删除 
exec :tmp := dbms_spm.drop_sql_plan_baseline(sql_handle=>'SQL_4fd8b0b98686fd73',plan_name=>'SQL_PLAN_82y5y7jctbuxrb2fbea4c');

完成。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

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

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 背景
  • 详细步骤
    • 查看sql A 的SQL_ID和PLAN_HASH_VALUE
      • 创建sql A的baseline,生成sql_handle
        • 查看baseline,A的sql_handle
          • 生成需要的sql B的执行计划
            • 将sql A的sql_handle与B的执行计划关联
              • 查看sql_handle,并删除原执行计划
              领券
              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档