网站首页 > 技术文章 正文
实验目标:
11g环境中针对某条sql语句进行执行计划固定,通过spm及sqlprofile两种方式,并模拟数据迁移到19c环境后同时实现执行计划的不变。
数据模拟
以下操作再11g环境中进行操作,模拟元数据
create user yz11 identified by yz default tablespace users;
grant connect,resource to yz11;
create table yz11.a1 as select * from dba_objects;
create index yz11.a_ind1 on yz11.a1(object_id);
手动修改index的统计信息,使优化器选择错误的执行计划
begin
sys.dbms_stats.set_index_stats(ownname=>'YZ11',
INDNAME=>'A_IND1',
numrows=>'999999999999999999999',
numdist=>1,
indlevel=>8
);
end;
/
全表扫描查看(由于index的统计信息不正确,执行计划错误的选择了全表扫描)
全表扫描查看object_id=20 yz11表,查看此时的执行计划
set linesize 500
set termout off
alter session set statistics_level=all; 设置统计信息级别
select object_id,object_name from yz11.a1 a where object_id=20; 执行的sql语句
查看执行计划
select * from table(dbms_xplan.display_cursor(null,null,'advanced -PROJECTION -bytes iostats,last'));
此时记录如下信息用于后面的spm的绑定
SQL_ID 1cbv8w5134zkt, child number 0
-------------------------------------
select object_id,object_name from yz11.a1 a where object_id=20
Plan hash value: 2676145672
通过hint强制使用索引扫描
set linesize 200
set termout off
alter session set statistics_level=all;
select /*+ index(a,A_IND1) */ object_id,object_name from yz11.a1 a where object_id=20;
select * from table(dbms_xplan.display_cursor(null,null,'advanced -PROJECTION -bytes iostats,last'));
记录新的sqlid及hash value
SQL_ID gdt647y1wjr1z, child number 0
-------------------------------------
select /*+ index(a,A_IND1) */ object_id,object_name from yz11.a1 a
where object_id=20
Plan hash value: 59315297
汇总如下:目标是创建spm测试使sql语句的查询使用快的执行计划。(索引访问)
针对A1表的id=20的查看语句
全表扫描:sqlid:1cbv8w5134zkt hash:2676145672 慢:
索引:sqlid:gdt647y1wjr1z hash:59315297 快:
绑定执行计划的格式
--绑定执行计划格式
declare
m_clob clob;
begin
select sql_fullteXt
into m_clob
from v$sql
where sql_id = '-------' --需要绑定的SQL ID 慢sql
and child_number = 0; --需要绑定的SQL ID对应的子游标编号 慢sql
dbms_output.put_line(m_clob);
dbms_output.put_line(dbms_spm.load_plans_from_cursor_cache(sql_id => '-----', --参考需要的执行计划SQL ID 及好的执行计划对应的SQL ID
plan_hash_value => -------, --参考需要的执行计划 Hash value
sql_text => m_clob,
fixed => 'YES',
enabled => 'YES'));
end;
/
绑定执行计划
查看当前的baseline信息
select sql_handle, plan_name, accepted, fixed,optimizer_cost from dba_sql_plan_baselines;
数据库中没有对应的baseline
执行如下sql进行baseline绑定
declare
m_clob clob;
begin
select sql_fulltext
into m_clob
from v$sql
where sql_id = '1cbv8w5134zkt'
and child_number = 0;
dbms_output.put_line(m_clob);
dbms_output.put_line(dbms_spm.load_plans_from_cursor_cache(sql_id => 'gdt647y1wjr1z',
plan_hash_value => 59315297,
sql_text => m_clob,
fixed => 'YES',
enabled => 'YES'));
end;
/
执行计划验证
再次执行sql操作select object_id,object_name from yz11.a1 a where object_id=20
sql语句不再使用全表扫描,即便统计信息不正确的情况下。而是使用了索引访问。
本文参考了《Oracle绑定的执行计划sql_profile_spm迁移-杨卓》的文档,根据文档步骤进行了模拟。
猜你喜欢
- 2024-11-10 SQL学习:SQL同比分析案例讲解,一看就懂
- 2024-11-10 SQL编写不合理导致历史日志查询特别慢
- 2024-11-10 详解Oracle 聚簇因子--概念、计算方式、影响因素及如何提高CF
- 2024-11-10 SQL统计行数的语句 mysql统计数量的语句
- 2024-11-10 Oracle 11g统计信息收集--多列统计信息的收集
- 2024-11-10 Oracle统计信息收集详解 oracle统计信息收集语句
你 发表评论:
欢迎- 09-0613.通过Excel导出数据库中的维值_数据库exp导入导出数据
- 09-06做数据分析时,SQL需要达到以下水平
- 09-06Java开发指南:JDK21下载、安装及目录解析,轻松开启编程之旅
- 09-06hive存储过程_hive存储过程环境变量
- 09-06Maven常用命令_maven常用命令有哪些
- 09-06JDK从8升级到21的问题集_jdk更新到几了
- 09-06Oracle狂刷存在感 NRF展会惊艳四座
- 09-06哪些软件支持UDI标签的生成与验证
- 最近发表
- 标签列表
-
- 前端设计模式 (75)
- 前端性能优化 (51)
- 前端模板 (66)
- 前端跨域 (52)
- 前端缓存 (63)
- 前端aes加密 (58)
- 前端脚手架 (56)
- 前端md5加密 (54)
- 前端路由 (61)
- 前端数组 (73)
- 前端js面试题 (50)
- 前端定时器 (59)
- Oracle RAC (76)
- oracle恢复 (77)
- oracle 删除表 (52)
- oracle 用户名 (80)
- oracle 工具 (55)
- oracle 内存 (55)
- oracle 导出表 (62)
- oracle约束 (54)
- oracle 中文 (51)
- oracle链接 (54)
- oracle的函数 (58)
- oracle面试 (55)
- 前端调试 (52)
本文暂时没有评论,来添加一个吧(●'◡'●)