Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >SPM手动绑定执行计划一例

SPM手动绑定执行计划一例

原创
作者头像
laosu
修改于 2021-10-15 10:10:00
修改于 2021-10-15 10:10:00
73500
代码可运行
举报
文章被收录于专栏:db小强db小强
运行总次数:0
代码可运行

背景

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
代码运行次数:0
运行
AI代码解释
复制
--从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
代码运行次数:0
运行
AI代码解释
复制
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
代码运行次数:0
运行
AI代码解释
复制
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
代码运行次数:0
运行
AI代码解释
复制
执行多次如下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
代码运行次数:0
运行
AI代码解释
复制
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
代码运行次数:0
运行
AI代码解释
复制
--查看原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 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Oracle固定SQL的执行计划(二)—SPM
之前写了一篇文章介绍的是用SQL Profile来调整、稳定目标SQL的执行计划,即使无法修改目标SQL的SQL文本。但SQL Profile实际上只是一种亡羊补牢、被动的技术手段,应用在那些执行计划已经发生了不好的变更的SQL上,即当我们发现这些SQL的执行计划已经出了问题时通过创建SQL Profile来纠正、稳定这些SQL的执行计划。即便通过创建SQL Profile解决了目标SQL执行计划变更的问题,依然不能保证系统后续执行的SQL的执行计划就不再发生不好的变更。这种不确定性会给Oracle数据库大版本升级(比如从Oracle 10g升级到Oracle 11g)带来一系列的麻烦,因为不清楚升级之后原先系统中哪些SQL的执行计划会发生不好的变更。
星哥玩云
2022/08/13
1.4K0
Oracle固定SQL的执行计划(二)—SPM
供收藏:Oracle固定SQL执行计划的方法总结
Oracle数据库中执行sql的时候,优化器会根据优化器统计信息和一些参数来生成“它认为最好的“执行计划。
SQLplusDB
2022/08/19
1.5K0
绑定运行计划sql_plan_baseline[通俗易懂]
–因为生产环境运行的sql变化较快,版本号公布比較频繁,造成sql的运行计划不是非常稳定。常常会有一些性能非常查的sql出现 –对于这些sql,我们能够使用sql_plan_baseline对运行计划进行绑定,从而使运行计划固定下来 –前提是sql最好使用绑定变量。就算有的没有绑定变量,确定字段的值不会改变才行。由于是针对sql_id进行的绑定,假设sql文本改变,绑定也就无意义了
全栈程序员站长
2022/01/24
5880
Oracle之SQL优化专题02-稳固SQL执行计划的方法
糟糕的SQL执行,执行计划走全表扫描(这里实验直接利用使用hint强制不走索引来模拟这种情况):
Alfred Zhao
2019/05/24
8550
【DB笔试面试610】在Oracle中,SPM的使用有哪些步骤?
这次正确的使用了索引。因为只有标记为ENABLE和ACCEPT的plan才可以被使用。
AiDBA宝典
2019/09/29
1.4K0
Oracle 19c OCM课程:应用SQL执行计划基线的案例
使用SQL执行计划基线可以保证SQL的性能不下降,但实际生产中默认没有开启,这里是姚远老师在给OCM的学员授课中关于SQL执行计划基线的一个案例,大家可以借鉴一下。
姚远OracleACE
2023/10/25
4900
Oracle 19c OCM课程:应用SQL执行计划基线的案例
【DB笔试面试609】在Oracle中,SPM(SQL Plan Management,SQL计划管理)是什么?
在Oracle中,SPM(SQL Plan Management,SQL计划管理)是什么?
AiDBA宝典
2019/09/29
1K0
如何最小化授予普通用户查看执行计划所需要的权限
通常在 scott 用户下,查看有几张表我都用 “select * from TAB;” ,但今天想看一下这个 SQL 的执行计划。结果郁闷了,普通用户 scott 无法查看,报错没有权限查看视图“V$SESSION”。
JiekeXu之路
2021/12/15
1.6K0
如何最小化授予普通用户查看执行计划所需要的权限
【DB笔试面试597】在Oracle中,获取执行计划有哪几种方法?
AUTOTRACE是Oracle自带的客户端工具SQL*Plus的一个特性。启用AUTOTRACE后,SQL*Plus会自动收集执行过的SQL语句的执行计划、性能统计数据等,并在语句执行结束后显示在SQL*Plus中。
AiDBA宝典
2019/09/29
6910
【DB笔试面试597】在Oracle中,获取执行计划有哪几种方法?
按图索骥:SQL中数据倾斜问题的处理思路与方法
数据倾斜即表中某个字段的值分布不均匀,比如有100万条记录,其中字段A中有90万都是相同的值。这种情况下,字段A作为过滤条件时,可能会引起一些性能问题。 本文通过示例分享部分场景的处理方法 未使用绑定变量 使用绑定变量 几种特殊场景 1 测试环境说明 数据库版本:ORACLE 11.2.0.4 新建测试表tb_test: create tablescott.tb_test as select * from dba_objects; 创建索引: create indexscott.idx_tb_test_01
企鹅号小编
2018/01/23
1.1K0
按图索骥:SQL中数据倾斜问题的处理思路与方法
【DB笔试面试582】在Oracle中,什么是绑定变量窥探(下)?
若启用了绑定变量窥探且WHERE条件为“目标列 BETWEEN X AND Y”的selectivity计算公式为:
AiDBA宝典
2019/09/29
1.2K0
Oracle面对“数据倾斜列使用绑定变量”场景的解决方案
    我们知道,Oracle在传统的OLTP(在线事务处理)类系统中,强烈推荐使用绑定变量,这样可以有效的减少硬解析从而增加系统的并发处理能力。甚至在有些老旧系统,由于在开始开发阶段缺乏认识没有使用到绑定变量,后期并发量增长且无法改造程序时,运维DBA还会不得已去设置cursor_sharing=force来强制使用系统的绑定变量(这是一个万不得已的方案,并不是最佳实践)。
Alfred Zhao
2019/08/27
2K0
Oracle获取执行计划的方法(六脉神剑)
优点:可以通过STRATS得出表被访问次数;可以通过E-Rows和A-Rows来判断预测行数和实际行数是否一致;可以通过Buffers来获取逻辑读数值。
Lucifer三思而后行
2021/08/17
6810
Oracle获取执行计划的方法(六脉神剑)
Oracle 执行计划查看方法汇总及优劣比较
执行计划是一条 SQL 语句在 Oracle 数据库中的执行过程或访问路径的描述。如下图所示,是一个比较完整的执行计划示意图。
JiekeXu之路
2022/12/07
1.6K0
Oracle 执行计划查看方法汇总及优劣比较
【DB笔试面试598】在Oracle中,如何得到真实的执行计划?
在Oracle数据库中判断得到的执行计划是否准确,就是看目标SQL是否被真正执行过,真正执行过的SQL所对应的执行计划就是准确的,反之则有可能不准,因此,通过10046事件及如下的几种方式得到的执行计划是最准确的,而从其它方式获取到的执行计划都有可能不准确。
AiDBA宝典
2019/09/29
7990
【DB笔试面试585】在Oracle中,什么是常规游标共享?
游标共享(Cursor Sharing)是指共享游标(Shared Cursor)之间的共享,游标共享可以实现重用存储在子游标(Child Cursor)中的解析树和执行计划而不用从头开始做硬解析,从而提高系统性能。特别对于同一类型的目标SQL更应该实现游标共享,而使用绑定变量就可以实现游标共享。
AiDBA宝典
2019/09/29
9900
[Oracle]-[sqlplus相关]-serveroutput参数
select /*+ no_index(t1 idx_t1) */ * from t1 where n=3; select * from table(dbms_xplan.display_cursor(null,null,'advanced'));
bisal
2019/01/29
1.2K0
视图 v$sql,v$sqlarea,$sqltext,v$sqltext_with_newlines 的差异
      视图v$sql,v$sqlarea,v$sqltext,v$sqltext_with_newlines 是几个经常容易混淆的视图,主要是提供library cache中当前缓存的sql语句的信息。这几个视图都可以提供当前有关sql语句的具体信息,但稍有差异。本文主要描述其差异并给出实例。
Leshami
2018/08/14
1.2K0
【DB笔试面试606】在Oracle中,coe_xfr_sql_profile.sql脚本的作用是什么?
在Oracle中,coe_xfr_sql_profile.sql脚本的作用是什么?
AiDBA宝典
2019/09/29
1.6K0
Oracle优化05-执行计划
如果要分析某条SQL的性能问题,通常来讲,我们首先要看SQL的执行计划,看看SQL的每一步执行计划是否存在问题。
小小工匠
2021/08/16
8790
推荐阅读
相关推荐
Oracle固定SQL的执行计划(二)—SPM
更多 >
LV.0
这个人很懒,什么都没有留下~
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档