跟大家说明一下:

ITSM 数据库迁移升级到11G后,有几条SQL语句的执行计划不正确,而且这些语句都是使用绑定变量的。

最初的调整想法是获得这些的语句的绑定变量值,将获得的字面值直接替换SQL语句的绑定变量,调整该SQL到正确的执行计划后执行,取得正确的执行计划并导入SPM。然而实际调整时发现,使用字面量获得的执行计划虽然可以正常导入到SPM,但是无法被相应的SQL语句使用,SQL语句仍然使用错误的计划执行查询。后面调整时,与实际生产时使用SQL语句方式一致,使用绑定变量的方式来执行调整后SQL语句,然后将获得计划导入SPM,发现语句可以使用SPM中的正确计划了。

具体的操作步骤可参看第一封邮件。

发件人: 张思明(Simon Cheung)

发送时间: 2011年10月18日 19:16

收件人: 聂宝红; ML_平安科技数据库技术支持部

主题: RE: ORACLE 11G 使用SPM来调整SQL语句的执行计划

聂宝红,要你发这个电邮是希望其他DBA能从你这次的问题处理上吸取经验。你这个电邮没有前文后理,没有背影介绍,只会让大家看得一头雾水。

From: 聂宝红

Sent: 2011年10月18日 19:00

To: ML_平安科技数据库技术支持部

Subject: ORACLE 11G 使用SPM来调整SQL语句的执行计划

1)获得执行计划错误的SQL语句的SQL_ID,并当前将坏的执行计划装载到SPM里:

variable cnt number;

execute :cnt :=DBMS_SPM.LOAD_PLANS_FROM_CURSOR_CACHE(SQL_ID => '&SQL_ID', PLAN_HASH_VALUE => &HASH_VALUE) ;

检查SPM,确认相关的SQL计划已经被装载到SPM。LOAD进来的一般是最新的:

select SQL_HANDLE, PLAN_NAME, ENABLED, ACCEPTED, SQL_TEXT from dba_SQL_PLAN_BASELINES where ACCEPTED = 'YES'

order by LAST_MODIFIED;

SQL_HANDLE PLAN_NAME

-------------------------------------------------------------

SQL_4079a044d6e19677 SQL_PLAN_40yd08mbfffddfdw555d8

2)调整SQL语句,如增加新的hint,确认获得好的正确的执行计划。执行一下调整后的语句,取得SQL_ID和Plan hash value:

select sql_id,plan_hash_value from v$sql where sql_text like '%/*+ test2-nbh INDEX(demand_state_alias%';

注意:对于绑定变量的SQL,最好也使用绑定变量的方式来获得正确的执行计划,如果使用字面量,执行计划虽然被装载,但可能无法被SQL语句使用。同时可以在SQL语句增加一些特别的提示,以容易获得修改后的语句,如上面的查询增加test2-nbh这样一个标识。

3)将正确的执行计划装载到SPM,准备用来替换错误的执行计划:

variable cnt number ;

exec :cnt :=dbms_spm.LOAD_PLANS_FROM_CURSOR_CACHE (SQL_ID => '&SQL_ID',PLAN_HASH_VALUE => &plan_hash_value,SQL_HANDLE => '&SQL_HANDLE' ) ;

SQL_ID: dzfky5zdzc231 –这个从步骤2中查询获得

Plan hash value: 751013780  –这个从步骤2中查询获得

SQL_HANDLE

SQL_4079a044d6e19677 --这个sql_handle是步骤1生成来的sql_handle

4)验证SPM执行计划是否正确

select * from dba_sql_plan_baselines where CREATED>sysdate-1/48 order by created;

--SQL_HANDLE为SQL_4079a044d6e19677的SPM记录有两个,可以通过时间的先后顺序来确定哪一个是

好的执行计划,也可以通过以下方 式:

select * from

table(dbms_xplan.DISPLAY_SQL_PLAN_BASELINE('&sql_handle','&PLAN_NAME');

--这里的sql_handle和PLAN_NAME来自步骤1生成的

5)验证了那个是错误的执行计划之后,将坏的执行计划从SPM里边删除

variable cnt number ;

exec :cnt :=dbms_spm.DROP_SQL_PLAN_BASELINE(SQL_HANDLE=> '&SQL_HANDLE', PLAN_NAME=> '&PLAN_NAME')

5)重新执行语句

6)检查语句执行计划是否正常

select

EXECUTIONS,PLAN_HASH_VALUE,ELAPSED_TIME/1000000,ELAPSED_TIME/1000000/EXECUTIONS,LAST_ACTIVE_TIME,ROWS_PROCESSED

from v$sql where EXECUTIONS>0 and sql_id='&sql'; select * from table(dbms_xplan.display_cursor('&sql'));

oracle++spm,ORACLE 11G 使用SPM来调整SQL语句的执行计划相关推荐

  1. 【Oracle】三种方式查看SQL语句的执行计划

    查看执行计划的方式有三种: EXPLAIN PLAN .V$SQL_PLAN .SQL*PLUS AUTOTRACE 1.EXPLAIN PLAN: 显示执行相应语句时可以使用的理论计划 读取执行计划 ...

  2. oracle+执行变量语句,ORACLE sql 语句的执行过程(SQL性能调整)

    第1章 SQL语句处理的过程 在调整之前我们需要了解一些背景知识,只有知道这些背景知识,我们才能更好的去调整sql语句. 本节介绍了SQL语句处理的基本过程,主要包括: · 查询语句处理 · DML语 ...

  3. Oracle 高性能SQL引擎剖析----执行计划

    执行计划是指示Oracle如何获取和过滤数据.产生最终结果集,是影响SQL语句执行性能的关键因素.我们在深入了解执行计划之前,首先需要知道执行计划是在什么时候产生的,以及如何让SQL引擎为语句生成执行 ...

  4. Oracle查询某一天日期数据的SQL语句的几种写法

    本文章向大家介绍Oracle查询某一天日期数据的SQL语句的几种写法,主要包括Oracle查询某一天日期数据的SQL语句的几种写法使用实例.应用技巧.基本知识点总结和需要注意事项,具有一定的参考价值, ...

  5. oracle取本月最后一天是星期几_oracle SQL语句取本周本月本年的数据

    --国内从周一到周日 国外是周日到周六 select to_char(sysdate-1,'D') from dual;--取国内的星期几 去掉减一取国外的星期 --取本周时间内的数据 select ...

  6. oracle添加表的索引,oracle批量添加指定表前缀的索引SQL语句

    oracle批量添加指定表前缀的索引SQL语句 需要输入用户名,表空间,索引个数,表名前缀,过滤的表名后缀 ##需要输入用户名,表空间,索引个数,表名前缀,过滤的表名后缀 declare --用户名 ...

  7. oracle数据库sql的执行过程,Oracle体系结构之SQL语句的执行过程

    一般来说,数据库处理SQL都会经过三个过程:解析(parse).执行(exec).返回结果(fetch) 1.解析 当用户发起一个SQL语句时,Oracle通过Server Process 接收SQL ...

  8. Oracle Sql语句定时执行

    Oracle Sql语句定时执行 本文链接:https://blog.csdn.net/qq_16979575/article/details/70169519 通过网上查询,找到一种方案,就是先在o ...

  9. 使用oracle sql profile固定执行计划

      2013-02-05 16:19:36 标签:oracle sql profile 版权声明:原创作品,如需转载,请与作者联系.否则将追究法律责任. 使用sql profile固定执行计划实验 1 ...

最新文章

  1. 五分钟使你的Firefox快两倍
  2. 程序界面把程序员这条路走下去
  3. RxJS - Observables, observers 和 operators 简介
  4. 算法-------LIS算法(Java版本)
  5. 快速 Get 面试题中:线程池七个参数和工作原理问题,理解万岁
  6. Re:从零开始的Vue项目搭建
  7. python生成c语言代码_Python爬取C语言中文网教程生成PDF
  8. java中int边界值_数组中重复的数字2019.12.06
  9. mac php fpm 自动启动,mac系统,php-fpm加入开机启动项
  10. AFNetworking 图片的本地缓存问题
  11. 隐马尔科夫-维特比算法
  12. php fprintf,PHP fprintf() 函数 - PHP 教程 - 菜鸟学堂-脚本之家
  13. 微信小程序中引入图标
  14. ipa shell自动打包
  15. eighth day for learning
  16. Fabric实战(10)链码(chaincode)开发-shim包API
  17. Building QNX guests
  18. 在PC上通过手机发送短消息
  19. 红外和可见光图像融合算法研究
  20. 爬虫之使用正则提取数据

热门文章

  1. Item 2: Understand auto type deduction.
  2. Python大数据培训课程培训费用是多少
  3. 多边形画椭圆算法java_运用椭圆画法,45行代码画出任意正多边形
  4. 基础5·BMI计算(if分支结构)
  5. 睿智的目标检测20——利用mAP计算目标检测精确度
  6. 恶意软件免杀与技术(2022.10.08)
  7. Excel作出线性回归图像
  8. 风力发电会影响气候?
  9. LTR 和 CTR 和 所谓的pointwise, pairwise, listwise的关系
  10. 关于工业镜头的景深以及分辨率