mysql执行计划固定_Oracle固定SQL的执行计划(一)---SQL Profile

2023-11-19

我们都希望对于所有在Oracle数据库中执行的SQL,CBO都能产生出正确的执行计划,但实际情况却并非如此,由于各种各样的原因(比如目标SQL所涉及的对象的统计信息的不准确,或者CBO内部一些成本计算公式的先天缺陷等),导致有时CBO产生效率不高、甚至是错误的执行计划。特别是CBO对目标SQL所产生的初始执行计划是正确的,后来由于某种原因(比如统计信息的变更等)而导致CBO重新对其产生了错误的执行计划,这种执行计划的改变往往会导致目标SQL执行时间呈数量级的递增,而且常常会让我们很困惑:这个SQL原先跑得好好的,为什么突然就慢得让人无法接受?其实这种SQL执行效率突然衰减往往是因为目标SQL执行计划的改变。

我们当然希望这样的改变永远不要发生,即在Oracle数据库中跑的所有SQL都能有正确的、稳定的执行计划,但实际上在Oracle 11g的SPM(SQL Plan Management)出现之前,这一点是很难做到的。那么现在退而求其次,如果已经出现了执行坟墓的变更,即CBO已经产生了错误的执行计划,我们应该怎么纠正呢?

我种情况下,我们通常会重新收集一下统计信息或者修改目标SQL(比如在目标SQL中加入Hint等)以纠正错误的执行计划。但有时候重新收集统计信息并不能解决问题,更糟糕的是,很多情况下是没有办法修改目标SQL的SQL文本的(比如第三方开发的系统,修改不了源码,或者目标SQL是前台框架动态生成的等等),那么这种情况下我们该怎么办呢?

在Oracle 10g/11g及其以后的版本中,我们可以使用SQL Profile或SPM(SQL Plan Management)来解决上述执行计划变更的问题,用它们来调整、稳定目标SQL的执行计划。

本文介绍使用SQL Profile来稳定执行计划:

Oracle 10g中的SQL Profile(直译为“SQL概要”)可以说是Oracle 9i中的Stored Outline(直译为“存储概要”)的进化。Stored Outline能够实现的功能SQL Profile也完全能够实现。

与Stored Outline相比,SQL Profile具备如下优点:

更容易生成、更改和控制

在SQL语句的支持上做得更好,也就是说适用范围更广。

使用SQL Profile可以很容易实现如下两个目的:

锁定或者说稳定执行计划

在不能修改目标SQL的SQL文本的情况下使目标SQL语句按指定的执行计划运行。

SQL Profile有两种类型:一种是Automatic类型,另一种是Manual类型。下面分别介绍这两种类型:

1. Automatic类型的SQL Profile

Automatic类型的SQL Profile其实就是针对目标SQL的一些额外的调整信息,这些信息存储在数据字典里。当有了Automatic类型的SQL Profile后,Oracle在产生执行计划时就会根据它对目标SQL所涉及的统计信息等内容做相应的调整,因而能够在一定程度上避免产生错误的执行计划。你不用担心Automatic类型的SQL Profile的准确性,因为Oracle会使用类型于动态采用技术那样的手段来保证这些额外调整信息相对准确。

Automatic类型的SQL Profile不会像Stored Outline那样锁定目标SQL的执行计划,因为Automatic类型的SQL Profile的本质就是针对目标SQL的一些额外的调整信息,这些额外的调整信息需要与原目标SQL的相关统计信息等内容一起作用才能得到新的执行计划,即原始SQL的统计信息等内容一旦发生变化,即使原有Automatic类型的SQL Profile并没有改变,该SQL的执行也可能会发生变化。从这个意义上讲,Automatic类型的SQL Profile并不能完全起到稳定目标SQL的执行计划的作用,虽然它确实可以用来调整执行计划。

看一个在不更改目标SQL的SQL文本的情况下使用Automatic类型的SQL Profile来调整执行计划的实例:

创建测试表及相关操作:

83b8e8a66e3a910b2df59f9f22788dd0.png

从上述显示内容可以看出,目标SQL走的是对表T1的全表扫描(Table Access Full),这个执行计划显然是错误,这里正确的执行坟墓应该是走索引IDX_T1的索引范围扫描(Index Range Scan)。下面使用SQL Tuning Advisor对这条SQL生成Automatic类型的SQL Profile。

a.先创建一个名为my_sql_tuning_task_2的自动调整任务:

注:创建任务时可以使用SQL来创建,可以适用于SQL文本长的情况。详情参考官方文档。

b.执行上述自动调整任务

c.查看上述自动任务的调整结果

2fdbd768a50a7c0e5f459ffe38657959.png

7fa076ffea5a9b2e9a3ad2a858ad76d3.png

从上述调整结果可以看到,Oracle现在告诉我们:它已经为目标SQL找到了更好的执行计划,并且已经创建了针对该SQL的Automatic类型的SQL Profile。如果我们使用accecp_sql_profile接受了这个SQL Profile,则目标SQL的响应时间将会有86.24%的提升,逻辑读将会有95%的提升,并且接受了该SQL Profile后目标SQL的执行计划将会由原来的全表扫描变为索引范围扫描。

上面Automatic类型的SQL Profile所产生的调整结果就是我们想要的,所以现在只需按Oracle的提示接受这个SQL Profile即可:

接受此SQL Profile后我们来看一下效果,再次执行目标SQL:

03bea3459c7d77adcde7f39fcfaa9b7b.png

注意到Note部分有这样的内容“SQL profile SYS_SQLPROF_015a82b353490000 used for this statement”这说明我们刚才接受的SQL Profile已经起了作用,该SQL Profile的名字为SYS_SQLPROF_015a82b353490000。从执行计划中也可以看到,执行计划确实已经改变了。

另外,DBMS_SQLTUNE.ACCEPT_SQL_PROFILE的输入参数force_match的默认值为FALSE,表示只有在SQL文本完全匹配的情况下才会应用SQL Profile,这种情况下只要目标SQL的SQL文本发生一点变动,原有的SQL Profile将会失去作用,如果设置为TRUE,即使SQL有变动SQL Profile也会强制生效。

删除SQL Profile

2. Manual类型的SQL Profile

Manual类型的SQL Profile本质上就是一堆Hint的组合,这一堆Hint的组合实际上来源于执行计划中的Outline Data部分的Hint组合。Manual类型的SQL Profile同样可以在不更改目标SQL的SQL文本的情况下,调整其执行计划,而且更为重要的是,Manual类型的SQL Profile可以起到很好稳定目标SQL的执行计划的作用,这一点是Automatic类型的SQL Profile所不具备的。

看一个使用Manual类型的SQL Profile实例固定执行计划的实例,使用上面的t1表,删除上面的SQL Profile,再次执行SQL

022cad482f041c8b049e8bb5e5f69a4b.png

从上述输出可以看出执行计划仍然走全表扫描。

现在来创建Manual类型的SQL Profile。这里使用了MOS上的一个脚本coe_xfr_sql_profile.sql。这个脚本用于从Shared Pool、AWR Repository中指定SQL的指定执行计划的Outline Data部分的Hint组合,来创建Manual类型的SQL Profile。

使用coe_xfr_sql_profile.sql脚本的步骤为

针对目标SQL使用coe_xfr_sql_profile.sql产生能生成其Manual类型的SQL Profile的脚本A。

改写目标SQL的文本,在其中使用合适的Hint,直到加入Hint后的SQL能走出我们想要的执行计划。然后对加入合适Hint后的SQL使用脚本coe_xfr_sql_profile.sql,产生能生成其Manual类型的SQL Profile的脚本B。

用脚本B中的Outline Data部分的Hint组合替换掉脚本A的Outline Data部分的Hint组合。

执行脚本A生成针对原目标SQL的Manual类型的SQL Profile。

现在改写上面的SQL,强制走索引:

c592ed181fd4ce08171d40b7784de3ed.png

从执行计划中可以看出SQL Id和对应的Plan hash value。

全表扫描的SQL Id:6chcc0pvvhqqm Plan hash value:3617692013

索引扫描的SQL Id:2ufquy7xs5nm5 Plan hash value:1369807930

a. 先使用coe_xfr_sql_profile.sql生成全表扫描SQL对应的脚本

从输出可以看出,生成一个名为coe_xfr_sql_profile_6chcc0pvvhqqm_3617692013.sql的脚本。

b. 用coe_xfr_sql_profile.sql生成索引扫描SQL对应的脚本

从输出可以看出,生成一个名为coe_xfr_sql_profile_2ufquy7xs5nm5_1369807930.sql的脚本。

c. 把后生成的脚本里的Outline Data部分的Hint组合替换到先生成的脚本里,即下图红框部分内容

6a3ef17cea6456330c46475683581a43.png

d. 执行coe_xfr_sql_profile_6chcc0pvvhqqm_3617692013.sql脚本

e. 执行完成后再次查看目标SQL的执行计划

19eb02f2a59f479aacf46a2c3087b823.png

从执行计划中可以看出已经走了INDEX RANGE SCAN,而且note部分提示SQL profile coe_6chcc0pvvhqqm_3617692013 used for this statement,说明执行sql时使用了该SQL Profile。

如果想在目标SQL的SQL文本发生变动时SQL Profile依然生效,则需要修改生成的脚本里的force_match=>true。

0b1331709591d260c1c78e86d0c51c18.png

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

mysql执行计划固定_Oracle固定SQL的执行计划(一)---SQL Profile 的相关文章

  • vue+element -UI前端Excel 文件导入数据

    完成的效果图如下 会进行数据筛选 根据你上传的物业名称跟数据库的名称对应 在这里我用到了一个插件 需要在在main js中全局引入 import export excel to json export json to excel from
  • linux之命名空间

    1 什么是命名空间 Linux中的命名空间 namespaces 是一种轻量级的虚拟化技术 ps docker就是依赖这个原理实现的 让进程看起来像是在自己的独立系统中运行 也就是说进程只能看到相同命名空间内的进程和资源 而看不到其他命名空
  • PG向表中添加新列时判断存在性

    以下是可以在命令行中执行的 SQL 语句 用于向表中添加新列并判断存在性 DO BEGIN BEGIN ALTER TABLE your table name ADD COLUMN IF NOT EXISTS your column nam
  • 服务器torchserver部署全流程踩坑记录

    服务器torchserver部署全流程踩坑记录 部署结果展示 一 Python环境 一 创建虚拟环境 二 安装torch cuda等 三 Python环境移植 二 java jdk环境 一 java jdk安装 1 sudo安装 需要sud
  • 使用selenium爬取唯品会

    使用selenium爬取唯品会 1 基本步骤 2 通过程序控制浏览器下拉滚动条获取加载信息 3 完成这个爬虫程序 使用selenium爬取动态加载的网页 爬取唯品会的商品 1 基本步骤 首先 创建一个浏览器驱动driver 查看唯品会页面u
  • 我的世界服务器聊天显示坐标,我的世界端游怎么显示坐标

    手机游戏cf的VIP等级会显示在最终游戏CF上吗 H 是的 无需感谢 我的世界如何环绕 单击显示不坐吗 前提是必须有一个区域插件 用木斧对角指向两个点 住所 牛仔竞技插件 您只能绘制自己的区域 其他 无法破坏或改变您的领土 每个玩家可以拥有
  • OpenCV机器视觉-识别红绿颜色

    识别红绿颜色 识别车道线 车道线检测 使用opencv来完成一个车道线检测的案例 完成这样的案例我们需要经历哪些步骤呢 我们先来思考一下解决问题的思路 当前情况下 摄像头拍出了很多的东西 例如路边的杂草远方的山 但是在我们自动驾驶的过程中
  • 【华为OD机试真题】补种未成活胡杨(C&C++&java&python&JavaScript&go)100%通过率【2023(B卷)100分】

    补种未成活胡杨 题目描述 近些年来 我国防沙治沙取得显著成果 某沙漠新种植 N 棵胡杨 编号 1 N 排成一排 一个月后 有 M 棵胡杨未能成活 现可补种胡杨 K 棵 请问如何补种 只能补种 不能新种 可以得到最多的连续胡杨树 输入描述 N
  • 【Android】Android ANR产生过程与分析方法

    前言 Android ANR问题一直是比较难解决的问题 一来它比较难以复现 二来复现后也不太好分析 这篇文章梳理一下ANR产生的过程以及出现ANR拿到日志文件如何定位原因 其实关于ANR线上监控也是比较棘手的 看了这篇文章我们再去看一些AN
  • linux内存调节之CMA

    本文贴代码过头了 以后想起来再优化一下吧 目录 概述 数据结构 构建初始化 DTS CONFIG DMA CMA 页表与物理页初始化 分配器激活 分配器使用 CMA部署 实战 概述 CMA Contiguous Memory Allocat
  • 小松的STM32教程(13)—— 驱动外部内存24C02

    预备 学习目标 概述 24cxx c include 24cxx h include delay h include delay h void IIC Init void GPIO InitTypeDef GPIO InitStructur
  • 数据结构之图的两种遍历实现(C语言版)

    上一期文章分享完了图的两种遍历方式 也是两种很重要的算法 DFS和BFS 这两种算法的应用和重要性我就不多说了 内行的人懂的都懂 今天这文章重要就是来上机实现这两种算法 又由于这两种算法都可以由邻接矩阵和邻接表来表示 博主分享的代码都是上机
  • pytorch c10.dll找不到

    import torch optim as optim File D Python38 lib site packages torch init py line 135 in
  • Matlab 编辑器框与命令行框视图分开两个窗口

    之前不知道怎么弄的 将matlab编辑器视图和命令行视图变成了两个窗口 效果如下图 这样调试代码我很不适应 点了好久才发现这叫停靠 点击编辑器窗口右上角 选择停靠 就能将编辑器窗口与命令行窗口在同一界面上
  • EduCoder_web实训作业--文本层次语义元素

    第一关 A D B B 第二关 strong 重要通知 strong
  • php GD库的使用

    两大功能 自己画 对于原有图片改变 PHP中GD库的使用 PHP 不仅限于只产生 HTML 的输出 还可以创建及操作多种不同格式的图像文件 PHP提供了一些内置的图像信息函数 也可以使用GD函数库创建新图像或处理已有的图像 目前GD2库支持
  • Java读取文件-BufferedReader/FileReader/InputStreamReader/FileInputStream的关系和区别

    一 Java读取和存储文件数据流 Java读取文件 实际是将文件中的字节流转换成字符流输出到屏幕的过程 这里面涉及到两个类 InputStreamReader和OutputStreamWriter InputStreamReader 将字节
  • 人工智能-基于U^2-Net的肖像画生成算法

    算法总体是在去年提出的U 2 Net remove background 的基础上实现了人物肖像的生成 并且较好地将细节复刻了下来 论文地址 https arxiv org pdf 2005 09007 pdf GitHub项目 https
  • Opencv图像增强算法(对比度增强)-opencv

    由于项目需要 这几天找了网上一个基于opencv的图像对比度增强算法的博客 但算法发布的日期太过久远了 2012年的代码放到现在很多类和类方法已经不再适用于新版本的opencv库了 所以我花了点时间重写了一下 并加入一些个人对于算法的理解与

随机推荐

  • Embedded image missed after moving page to another space in Confluence

    There is a resolution https confluence atlassian com display CONFKB Resolve Missing Attachments in Confluence The issue
  • 如何用递归解决n皇后问题?

    问题描述 在n n的棋盘中摆放n个皇后 要求每个皇后不攻击 输出所有的解 输入 一个正整数n 输出 所有的解 例如 输入 4 输出 2 4 1 3 输出的第1个数的数值x表示 该皇后放在第一行的第x列 3 1 4 2 include
  • PL2303HXA自2012已停产,请联系供货商的解决办法

    一 概述 PL2303 是Prolific 公司生产的一种高度集成的接口转换器 可提供一个RS232 全双工异步串行通信装置与USB 功能接口便利连接的解决方案 PL2303具有多个历史版本 早期的版本是PL2303HX 近年有PL2303
  • 掉电无法启动数据库问题解决

    由于突然掉电 造成客户在windows平台上10 2 0 1数据库无法驱动 以下是具体解决步骤 一 定位故障问题 1 启动数据库 查看错误 SQL gt startup ora 01113 file 1 needs media recove
  • 文献管理软件工具讲解-------阿冬专栏!!!

    一 Endnote Mendeley Zotero NoteExpress 和 NoteFirst 这些文献管理软件从功能上各有特色 网上的评论文章也不少 我自己的的使用体验 如下 A 功能方面 在导入中文文献数据的准确性上 Endnote
  • Python手册

    前言 Python编程语言可以很好地协调一些看起来似乎很明显的矛盾 Python编程语言格式优雅并注重实效 简单而且功能强大 非常高层但是并不妨碍用户对底层的比特 bit 和字节 Byte 的处理 Python编程语言适合于编程新手 对Py
  • Oracle中的子程序和程序包

    存储过程的语法 CREATE OR REPLACE PROCEDURE
  • 华为机试题107-求解立方根

    描述 计算一个浮点数的立方根 不使用库函数 保留一位小数 数据范围 val 20 输入描述 待求解参数 为double类型 一个实数 输出描述 输出参数的立方根 保留一位小数 示例1 输入 19 9 输出 2 7 示例2 输入 2 7 输出
  • 《2022数字藏品研究报告》首发,读懂NFT中西方价值捕获的分化之路

    NFT作为 柯林斯词典 2021年度热词榜第一 很多人愿意称2021年为NFT元年 在过去几年里 我们见证了NFT从早期Myspace里的Pepe圈内文化发展成为风靡全球的潮流风向标 无论是在音乐圈 游戏圈或者摄影圈 如果你想成为行业的弄潮
  • 【Makefile】Makefile的使用

    Makefile的使用 一 Makefile简单介绍 二 Makefile的核心规则 三 Makefile的语法 syntax 1 通配符 patten 2 假象目标 phony 3 变量 variable 四 Makefile函数 1 函
  • IDEA项目中Maven仓库爆红

    很久没看项目 突然有一天打开发现maven仓库爆红 把仓库删了重新下载东西也没有变化 后来发现主要原因在pom xml中http maven apache org POM 4 0 0爆红 现在已经改了 提示URL无效 于是在settings
  • 搞清CSS样式中background-position(背景图片定位)

    昨天看一个网页的时候 看到一句 background url images top2 jpg no repeat 50 9px 其中50 代表的意义等同于left 容器 container 的宽度 背景图片的宽度 left百分比 超出的部分
  • Vue使用高德地图报 INVALID_USER_SCODE 错误

    项目场景 通过地点名称搜索并更新地图位置没有反应 搜索功能失效 问题描述 输入地点后点击搜索报错 原因分析 自2021年12月02日升级 升级之后所申请的 key 必须配备安全密钥 jscode 一起使用 解决方案 通过在高德开放平台创建并
  • Linux stat 命令及示例

    介绍 该stat命令打印有关文件和文件系统的详细信息 该工具提供有关所有者是谁 修改日期 访问权限 大小 类型等信息 该实用程序对于故障排除 在更改文件之前获取有关文件的信息以及例行文件和系统管理任务至关重要 本文stat通过实际示例解释了
  • 跨平台游戏引擎 Axmol-2.0.0 正式发布

    下载 https github com axmolengine axmol releases tag v2 0 0 更新日志 添加实验性的 WebAssembly 构建支持 WebGL 2 0 由 nowasm 贡献 已知问题 WebGL
  • C++:压缩算法1.0

    题目描述 某压缩算法的基本思想是用一个数值和一个字符代替具有相同值的连续字符 例如 输入字符串 RRRRRGGBBBBBBC 压缩后为 5R2G6B1C 请编写程序实现上述功能 输入 输入共一行 一串待压缩的字符 输出 输出共一行 压缩后的
  • uniapp实现猜数字小游戏

    一个uniapp的样例 超级简单 效果图在最后 外观 首先定义文字区块 用来告诉玩家现在改干什么以及猜的数字是猜大了还是猜小了
  • C++ STL迭代器相关

    map 迭代器 以下代码在编译时出错 提示c map报错 map set iterators incompatible map
  • 客户端无法连接腾讯云服务器Redis

    一 问题 使用Redis Desktop Manager 昨天可以连接上Redis服务器 今天却不可以 二 解决方案 1 确保IP地址 端口号 输入密码正确 1 1 redis conf 文件中port 1 2 redis conf文件中r
  • mysql执行计划固定_Oracle固定SQL的执行计划(一)---SQL Profile

    我们都希望对于所有在Oracle数据库中执行的SQL CBO都能产生出正确的执行计划 但实际情况却并非如此 由于各种各样的原因 比如目标SQL所涉及的对象的统计信息的不准确 或者CBO内部一些成本计算公式的先天缺陷等 导致有时CBO产生效率