首页 > 数据库 >一个执行计划异常变更的案例 - 外传之SQL Profile(下)

一个执行计划异常变更的案例 - 外传之SQL Profile(下)

时间:2023-06-19 14:07:47浏览次数:47  
标签:Profile 外传 SQL 计划 sql 执行


之前的几篇文章:
《一个执行计划异常变更的案例 - 前传》
《一个执行计划异常变更的案例 - 外传之绑定变量窥探》
《一个执行计划异常变更的案例 - 外传之查看绑定变量值的几种方法》
《一个执行计划异常变更的案例 - 外传之rolling invalidation》
《一个执行计划异常变更的案例 - 外传之聚簇因子(Clustering Factor)》
《一个执行计划异常变更的案例 - 外传之查询执行计划的几种方法》
《一个执行计划异常变更的案例 - 外传之AWR》
《一个执行计划异常变更的案例 - 外传之ASH》
《一个执行计划异常变更的案例 - 外传之SQL AWR》
《一个执行计划异常变更的案例 - 外传之直方图》
《一个执行计划异常变更的案例 - 外传之SQL Profile(上)》

上篇文章介绍了Automatic类型的SQL Profile,这种类型的SQL Profile隐患就是未锁定执行计划,只是对统计信息进行了一些修正,一旦表统计信息出现了一些波动,就可能出现错误的修正。

为了解决这种问题就可以尝试Manual类型的SQL Profile,我们来看下他是如何不变更原文的情况下,调整执行计划,并做到可以稳定执行计划的目的。

为了创建Manual类型的SQL Profile,我们需要使用MOS(All About the SQLT Diagnostic Tool (文档 ID 215187.1))中可下载的一个脚本coe_xfr_sql_profile.sql。

我们依旧采用上篇文章中使用的测试表t1和t2,数据量、索引和统计信息收集均相同。使用如下SQL执行计划不是最优的,

一个执行计划异常变更的案例 - 外传之SQL Profile(下)_SQL

通过上篇文章的分析,我们知道这才是最优的执行计划,

一个执行计划异常变更的案例 - 外传之SQL Profile(下)_SQL_02

首先查询这两条SQL对应的sql_id,

一个执行计划异常变更的案例 - 外传之SQL Profile(下)_执行计划_03

查询这两个sql_id对应的plan_hash_value,

一个执行计划异常变更的案例 - 外传之SQL Profile(下)_sql_04

执行coe_xfr_sql_profile.sql脚本,输入参数为上面第一次执行的SQL语句(即需要优化的)对应的sql_id和plan_hash_value,

一个执行计划异常变更的案例 - 外传之SQL Profile(下)_sql_05

输出结果中含有一个脚本,命名格式就是“coe_xfr_sql_profile_(sql_id)_(plan_hash_value).sql,

一个执行计划异常变更的案例 - 外传之SQL Profile(下)_sql_06

打开脚本可以看见其注释,说明他可以创建一个自定义的SQL Profile,

一个执行计划异常变更的案例 - 外传之SQL Profile(下)_SQL_07

接着我们对使用正确执行计划的SQL执行脚本,

一个执行计划异常变更的案例 - 外传之SQL Profile(下)_sql_08

同样生成了一个脚本,

一个执行计划异常变更的案例 - 外传之SQL Profile(下)_执行计划_09

我们用正确的执行计划对应的脚本中HINT部分,

一个执行计划异常变更的案例 - 外传之SQL Profile(下)_执行计划_10

替换错误执行计划对应的脚本中HINT部分,

一个执行计划异常变更的案例 - 外传之SQL Profile(下)_SQL_11

同时将下面这个参数force_match的默认值FALSE改为TRUE,意思是针对不同文本值的SQL,可以重用此SQL Profile,

一个执行计划异常变更的案例 - 外传之SQL Profile(下)_sql_12

然后执行此脚本,

一个执行计划异常变更的案例 - 外传之SQL Profile(下)_sql_13

此时就创建了一个Manual类型的SQL Profile。

我们看下效果,重新执行SQL,

一个执行计划异常变更的案例 - 外传之SQL Profile(下)_执行计划_14


可以看出执行计划已经是最优的,而且Note部分说明已经使用了SQL Profile。此时我们再次将t1表优化器认知的数量改为500万,

一个执行计划异常变更的案例 - 外传之SQL Profile(下)_sql_15

Automatic类型的SQL Profile此时就会由于缩放错误,再次选择错误的执行计划,我们看下这种Manual类型的SQL Profile,

一个执行计划异常变更的案例 - 外传之SQL Profile(下)_sql_16


看出仍旧使用的正确执行计划,证明了这种类型的SQL Profile是可以锁定正确执行计划。上面我们将force_match参数值设为了TRUE,看下有什么作用,

一个执行计划异常变更的案例 - 外传之SQL Profile(下)_sql_17


我们将%ABC%换为了%ZZZ%,仍旧采用了正确的执行计划。当然,如果SQL语句变了,意味着上述手工创建的SQL Profile就不能用了,除非再次创建对应的SQL Profile,

一个执行计划异常变更的案例 - 外传之SQL Profile(下)_sql_18

总结:
和上篇文章介绍的Automatic类型的SQL Profile相比,Manual类型的SQL Profile的创建过程要复杂一些,但其可以不改SQL的前提下,调整执行计划,最重要的是他能稳定执行计划,不会因为统计信息波动等问题,导致选择错误的执行计划,对于一些短期内不能改应用调整SQL的场景,我们可以选择合适的SQL Profile类型进行执行计划的调整操作。

欢迎关注我的个人微信公众号:bisal的个人杂货铺

一个执行计划异常变更的案例 - 外传之SQL Profile(下)_sql_19


标签:Profile,外传,SQL,计划,sql,执行
From: https://blog.51cto.com/u_13950417/6512760

相关文章

  • 一次SQL_ID和HASH_VALUE转换尝试引发的误区
    这篇文章中曾谈到一个隐藏问题:引用原文:“使用@dbsnake大牛的SQL可以知道SQL_ID和HASH_VALUE的一一对应关系:隐藏问题1:这里的截图可能有点问题,结果并不准确,问题就出在这个SQL中使用的算法中,在另一篇博文中会仔细说明这个问题。”问题背景:这里使用以下两个SQL获取SQL_ID对应的HASH_VAL......
  • MySQL表类型和存储引擎
    基本介绍MySQL的表类型由存储引擎决定,主要包括MyISAM、innoDB、Memory等MySQL数据表主要支持六种类型,分别是:CSV、Memory、ARCHIVE、MRG_MYISAM、MYISAM、InnoDB这六种又分为两类,一类是“事务安全型”,比如:InnoDB;其余都属于第二类,称为“非事务安全型”细节说明MyISAM不支持事务、也不......
  • MySQL时间函数的选择
    Oracle中获取系统当前的时间,可以用sysdate、systimestamp等函数,在MySQL中,同样有类似的函数可以使用,碰巧看到eygle大神最近的文章,短短几行文字,就介绍了MySQL中获取系统当前时间的来龙去脉。在MySQL中,获得系统当前时间可以使用now()函数,这是最简单和应用最广的函数。除此之外,curre......
  • 一个执行计划异常变更的案例 - 外传之查看绑定变量值的几种方法
    这篇外传之前有这么几篇文章:《一个执行计划异常变更的案例-前传》《一个执行计划异常变更的案例-外传之绑定变量窥探》上一篇文章介绍了绑定变量以及11g之前绑定变量窥探的影响,这篇文章会介绍几种查看绑定变量值的方法。上篇文章我们说了,绑定变量实际是一些占位符,可以让仅......
  • 初探MySQL-小白的Linux安装笔记
    这篇文章是我们组内一位小伙伴垒的文字,亲测每个步骤,真实、可靠、接地气,照着做就能入门Linux下的MySQL安装,欢迎更多的小伙伴能将日常工作中的经验记录下来,分享给其他人,正所谓“独乐乐不如众乐乐”。最近接到一个任务,由于开发环境变化,需要将旧机器上的mysql迁移到新机器上去,其中涉及......
  • 如何找到抛出ORA-00933错误的SQL
    前几天上线,凌晨3点多打车回来的路上,兄弟联系我,提了一个问题,某核心系统,上线的时候,报了很多ORA-00933的错误,明显是应用写的SQL出现了错误导致的,但是因为未将出错的SQL打印到日志中,所以不知道究竟是什么SQL出错了,由于逻辑中涉及到很多的SQL,逐个排查,非常耗时。ORA-00933,意思是“SQLcom......
  • 通过索引提升SQL性能案例一则
    最近有个应用,前端调用后台的一个逻辑很慢,请开发提供了对应逻辑使用的SQL,进行脱敏,示例如下,selectt.AGENTasagent,nvl(sum(casewhent.operation_type='A'then1else0end),0)asDflCount,nvl(sum(casewhent.operation_type=......
  • 小白学习MySQL - 闲聊聊
    众所周知,在DB-Engines的排行榜,一直占据前两位的数据库,就是Oracle和MySQL,Oracle作为关系型数据库的老大,在这个生态圈中,占据着绝对优势,MySQL作为一款面向“开源"的软件,虽然被Oracle曲线收购,相比之下,还是存在着“开源”的血统,而且有很多分支,无论是国外的MariaDB,还是国内的AliSQL,都在发......
  • 小白学习MySQL - MySQL会不会受到“高水位”的影响?
    前两天碰到了一个问题,MySQL的一张表,1220万数据量,需要删除1200万数据,仅存储20万数据,讨论了三种方案,1.00:00直接执行truncate,只存储新数据。2.将1220万中的20万采用CTAS存到一张中间表,再通过rename改这两张表的名称,实现替换操作。3.delete删除1200万数据。经过综合考虑,用的方案3,方......
  • mybatis-plus 数据库日志仅打印SQL
     一、项目背景:springboot、web组件、Mysql8、java8+; 二、开发环境打印SQL及执行结果日志,便于调试接口;mybatis-plus配置文件的configuration节点添加以下配置2、效果   三、生产环境仅打印SQL,避免打印过多的查询结果影响系统性能    1、pom中增加sl4j的......