聊聊Oracle自适应查询优化

成也AQO败也AQO

因为工作的原因,我们接触到的客户大部分是金融和运营商行业,这些客户有个最大的特点是追求稳定,对于使用数据库新特性持保守的态度,不会轻易尝试某些可能会导致生产系统不稳定的新特性。上线前通常都会将一些新特性禁用,避免上线后可能会由于这些新特性而导致性能出现抖动。

但是近期遇到的一个case,却颠覆了我对这些新特性的看法。

最近我们在帮客户分析一条SQL的性能问题,过程中发现由于数据库的Adaptive Plan参数是默认的开启状态,产生了比较多的子游标,当使用某个条件时就会出现性能下降的情况。作为本能的反应,我们建议客户关闭Adaptive Plan功能,给出的理由是“虽然未必是最优的,却是我们能接受的稳定性能”。修改完参数客户重新测试执行了相关的业务模块,之前有问题的SQL按照预期很顺利的执行完成,但是又出现了新的情况,有另一条在之前的测试中秒级执行的SQL这次却整整用了2000+秒才执行完成。这不由得让我们重新审视Adaptive Plan带给数据库的正面影响。

什么是 AQO (自适应查询优化)

为了SQL语句能够始终以最优的执行计划执行,Oracle在不断的探索和革新。从9i的绑定变量Peeking,到11g的ACS和Statistics Feedback,在12c中则引入了Adaptive Query Optimization。

Statistics Feedback在SQL第一次执行时,根据统计信息生成的执行计划执行SQL,执行过程中执行计划不能改变,如果统计信息不准确,在SQL第一次执行时可能就会引起灾难性的问题。而且,Statistics Feedback生成的数据只能保存在内存中而不能固化下来,如果过程中数据库发生了重启,需要重新收集Statistics Feedback信息,这可能导致再一次的灾难发生。

Adaptive Query Optimization就是为了彻底解决这两个问题而引入的,具体包括两方面的功能:自适应执行计划和自适应统计信息。
在这里插入图片描述

自适应计划 (Adaptive Plans)

区别于Statistics Feedback在第一次执行后对比实际运行数据和统计信息对比,发现差异较大再对执行计划进行干预的方式不同,Adaptive Plans将执行计划决策和统计信息收集结合起来,在运行时检测基数估计值是否与执行计划中操作所看到的实际行数有很大的差异,如果差异较大,将会对执行计划进行自动调整,避免SQL语句选择次优的执行计划影响执行性能。具体的干预方式有Join Method、Parallel Distribution Methods和Bitmap Pruning 3种。

Join Method

主要是在Nest Loop和Hash Join之间进行评估决策。执行计划根据收集到的统计信息,计算不同执行计划优劣的“临界点”。比如当A表扫描的行数少于10时Nest Loop是最优的,当扫描的行数大于10则Hash Join是最优的,那么10就是这两种连接方式的“临界点”。有了这个值之后,优化器配置Buffer统计收集器缓存数据,如果扫描涉及到的行数超过10则使用Hash Join,反之则使用Nest Loop。

PARALLEL DISTRIBUTION METHODS

当SQL语句并行执行时,某些操作(如排序、聚合和连接)需要在执行该语句的并行服务器进程之间重新分配数据。优化器选择的分发方法取决于操作、所涉及的并行服务器进程的数量以及预期的行数。如果优化器不准确地估计行数,那么所选择的分布方法可能不是最优的,并可能导致一些并行服务器进程未得到充分利用。

和Join Method的决策方式类似,使用新的自适应分布式方法HYBRID HASH,优化器可以将其分布式方法决策推迟到执行时。相关的并行操作之前会收集统计信息,如果实际涉及的行数少于阈值,则将分布式方法从Hash切换到Broadcast;如果涉及的行数达到阈值,则使用Hash方法。

自适应统计信息

通过上述的介绍,相信大家已经理解了Adaptive Plans是如何指导优化器生成最优执行计划的,在这其中统计信息发挥了非常重要的作用。接下来我们再来看看AQP中自适应统计信息又是如何工作的。

自适应统计信息包括Dynamic Statistics、Automatic Re-optimization和SQL Plan Directives三部分内容。

Dynamic Statistics

在12c之前称为Dynamic Sampling,进化后的动态统计信息引入了Level 11,允许优化器在所有表已经存在统计信息的情况下,自动选择是否使用动态统计信息。动态统计信息收集的数据不仅仅针对单表访问,还包括Join和Group-By谓词条件的统计信息,以此来获得更准确的基数评估。

Automatic Re-optimization

主要包括两部分内容,Statistics Feedback和Performance Feedback。

Statistics Feedback就是11g中的Cardinality Feedback,前面我们也多次提到过其相关的功能,这里就不再赘述。

Performance Feedback主要用于提高Automatic Degree of Parallelism模式下,重复执行的SQL语句选择的并行度。

SQL Plan Directives

前面讲到Statistics Feedback不能保存评估出的信息,因此Oracle又引入了SQL plan directives功能。SQL plan directives 可以看成是持久化的动态采样信息,当优化器发现有评估错误的数据时,会自动生成SPD,这些数据首先保存在SGA内存中,每隔15分钟由后台进程写出到数据字典表中。和SQL Profile和SPM等SQL执行计划稳定工具不同的是,SPD关联的是表或者列等特定对象,而不是某条特定SQL语句。

SPD包括DYNAMIC_SAMPLING 和DYNAMIC_SAMPLING_RESULT两种类型,其中DYNAMIC_SAMPLING用于指示优化器当看到谓词过滤涉及多个列的查询时,使用dynamic sampling来解决基数评估不准确的问题;而DYNAMIC_SAMPLING_RESULT则替代了12.1中的Result Cache,将动态抽样的结果保存在SQL directive仓库中。

写在最后

总体来看,Adaptive Query Optimization涉及到非常多的组件,这也让整个实现流程变得非常复杂,以至于即使笔者这样的老DBA也花了不少时间梳理各个组件之间的关系和理解工作原理,从而更好的用于指导生产实施。

理想美好而现实却是骨感的,AQP的设计理念非常完美但在实际生产过程中仍然存在不少的问题。

统计信息收集非常频繁,生产环境中的各种组合查询千差万别,使得动态统计信息收集介入非常频繁,极端的情况下,9万条SQL可能有7万条是系统自发采集统计信息的,这也让生产系统无形中承载了更多的负担;

过多的SPD会让系统变的更敏感。不同的绑定变量代入值会生成不同的游标,让同一条SQL的执行计划切换非常频繁,而这种切换并不能保证每次都是在最优路线上。对于稳定压倒一切的大多数客户来说,宁愿稳定的跑在次优路线上,也不愿意承担哪怕万分之一的不稳定带来的风险。

或者正因为存在着种种的问题,12.2进行了较大的调整,optimizer_adaptive_features参数被废弃,引入了两个新的参数optimizer_adaptive_plans 和optimizer_adaptive_statistics。其中,optimizer_adaptive_plans用于控制是否允许创建Adaptive Plan,该参数默认为TRUE;optimizer_adaptive_statistics 则用于控制是否允许优化器使用 Adaptive Statistics,该参数默认为FALSE,从而使得优化器不会在解析时间修改SQL语句的执行计划。这也是关注到大多数客户优先考虑的是系统稳定性而不是最大化查询执行性能,最终权衡的一个结果。

最后,我们也看到了积极的一面,在关闭了AQP功能之后,才发现不知不觉中SPD也帮我们规避了不少的风险,默默的让数据库运行的更加高效。只是从理想到现实,仍然有很长的路要走,这也是Oracle不断前进的方向和动力,相信在后续的版本中会有更大的进步!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/937520.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

纯CSS实现文本或表格特效(连续滚动与首尾相连)

纯CSS实现文本连续向左滚动首尾相连 1.效果图&#xff1a; 2.实现代码&#xff1a; <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-width, init…

深度学习物体检测之YOLOV5源码解读

V5比前面版本偏工程化,项目化,更贴合实战 一.V5版本项目配置 (1)整体项目概述 首先github直接查找yolov5&#xff0c;下载下来即可。在训练时&#xff0c;数据是怎么处理的&#xff1f;网络模型架构是怎么设计的(如各层的设计)&#xff1f;yolov5要求是大于python3.8与大于等…

uniapp h5 js设置监听:超时未操作返回首页(全局只监听一次,可设置监听事件+检查时间+超时时长)

功能实现: 可自定义超时时长,检查时间超时后跳转首页(/pages/home/index/index); 如果在首页,则不进行跳转监控状态下, 用户有任意操作(包括但不限于点击,滑动,跳转页面等),则重置监听,重新开始算时间超时方法及逻辑封装到单独的js文件中 全局只需在app.vue创建监听,其他页面无…

MAC M3电脑在idea上搭建Spark环境并跑通第一个程序

我的电脑是Macbook Pro&#xff0c;最近在学习Spark&#xff0c;想要在idea里搭建Spark环境&#xff0c;为之后的Spark编程作准备。下面是在MAC版本的idea里配置Spark环境。 1. 准备工作 1.安装 JDK 确保Mac 上已经安装了 JDK 8 或更高版本。 可通过 java -version 查看是否…

展柜设计公司平面布置小程序的分析与设计springboot+论文源码调试讲解

3系统的需求分析 需求分析的任务是通过详细调查展柜设计公司平面布置小程序软件所需的对象&#xff0c;充分了解系统的工作概况&#xff0c;明确功能实现的各种需求&#xff0c;然后在此基础上确定系统的功能。系统必须充分考虑今后可能的扩充和改变。 3.1可行性分析 通过对…

用人话讲计算机:Python篇!(十二)正则运算+re模块

目录 一、正则表达式 &#xff08;1&#xff09;什么是正则表达式 &#xff08;2&#xff09;它的结构及使用 示例&#xff1a; 1.字符 . &#xff08;←这里有个小点哦&#xff09; 2.字符 | 3.字符 [ ] 4.字符^ 5.字符\d &#xff08;3&#xff09;补充&#xff…

C# 与PLC数据交互

点击跳转下载地址 点击跳转胡工科技官网

康佳Android面试题及参考答案(多张原理图)

JVM 内存分布和分代回收机制是什么? JVM 内存主要分为以下几个区域。 堆(Heap)是 JVM 管理的最大的一块内存区域,主要用于存放对象实例。所有线程共享堆内存,在堆中又分为年轻代(Young Generation)和老年代(Old Generation)。年轻代又分为 Eden 区和两个 Survivor 区(…

家校通小程序实战教程10部门管理前后端连接

目录 1 加载后端的数据2 为什么不直接给变量赋值3 保存部门信息4 最终的效果5 总结 现在部门管理已经完成了后端功能和前端开发&#xff0c;就需要在前端调用后端的数据完成界面的展示&#xff0c;而且在录入部门信息后需要提交到数据库里&#xff0c;本篇我们介绍一下前后端如…

【Java】链接数据库简介

JDBC基本原理 JDBC 提供了一套通用的接口&#xff0c;允许 Java 程序与不同类型的数据库进行交互。 JDBC 是 Java 提供的一种用于与数据库通信的 API&#xff08;应用程序编程接口&#xff09;&#xff0c;定义了 Java 程序如何与数据库进行连接、执行查询、操作数据等。JDBC…

企业级包管理器之 monorepomultirepo (8)

在企业级项目开发中&#xff0c;面对多个项目的管理&#xff0c;monorepo 和 multirepo 是两种常见的代码管理方案&#xff0c;它们各有特点与优劣&#xff0c;下面我们来详细了解一下。 一、基本概念 monorepo&#xff1a;“mono”在英语中有“单一的、单独的”之意&#xf…

SQLite 数据库学习

0.引言 SQL, 全名是 Structured Query Language, 中文翻译是"结构化查询语言"。它是一种专门用来与数据库交互的语言。简单来说&#xff0c;SQL就是跟数据库"对话"的一种语言。 1.install sudo apt update sudo apt install sqlitebrowser这是一个开源的…

电子科技大学考研,计算机与软件专业怎么选择?

电子科技大学在计算机与软件领域具备卓越实力&#xff0c;其毕业生就业前景及薪资水平均颇为可观。因此&#xff0c;学生应依据个人课程专长来选定专业。若各项课程均表现出色&#xff0c;推荐25届考生优先考虑软件专业&#xff0c;因其上岸难度相对较低。 接下来&#xff0c;C…

智能客户服务:科技赋能下的新体验

在当今这个数字化时代&#xff0c;客户服务已经不仅仅是简单的售后服务&#xff0c;它已竞争的关键要素之一。随着人工智能、大数据、云计算等技术的飞速发展&#xff0c;智能客户服务正逐步改变着传统的服务模式&#xff0c;为企业和消费者带来了前所未有的新体验。 一、智能客…

HCIA-Access V2.5_2_3_网络通信基础_以太网概述

什么是以太网 以太网是由IEEE定义的局域网技术&#xff0c;也是目前应用最普遍的技术&#xff0c;早期的令牌环网&#xff0c;FDDI等局域网技术都被它取代了&#xff0c;以太网主要分为两类&#xff0c;共享型以太网和交换型以太网。共享式以太网主要采用总线型的拓扑结构&…

Unix 传奇 | 谁写了 Linux | Unix birthmark

注&#xff1a;本文为 “左耳听风”陈皓的 unix 相关文章合辑。 皓侠已走远&#xff0c;文章有点“年头”&#xff0c;但值得一阅。 文中部分超链已沉寂。 Unix 传奇 (上篇) 2010 年 04 月 09 日 陈皓 了解过去&#xff0c;我们才能知其然&#xff0c;更知所以然。总结过去…

【嵌入式软件】跑开发板的前置服务配置

在嵌入式开发中,通常需要在 开发板和主机之间共享、传输和挂载文件。 这篇文章是关于如何在 Ubuntu 中配置 Samba、TFTP 和 NFS 协议的详细步骤。这些协议分别用于远程文件共享、文件传输和内核挂载文件系统。 如何安装协议: 参考:ubuntu18配置:详细的内容我手写了一份文档。…

【docker】springboot 服务提交至docker

准备docker &#xff08;不是docker hub或者harbor&#xff0c;就是可以运行docker run的服务&#xff09;&#xff0c;首先确保docker已经安装。 本文以linux下举例说明&#xff1a; systemctl stats docker ● docker.service - Docker Application Container EngineLoaded…

C/C++代码性能优化技巧的书籍及资料

使用C/C开发的场景&#xff0c;大多对代码的执行的速度&#xff0c;实时性有较高的要求&#xff0c;像嵌入式系统的开发&#xff0c;资源还受限。在算力存储空间有限的MCU上写出简洁又高效的代码实际是一种艺术。软件工程师在代码设计上的这种差距&#xff0c;会反映在产品的性…

【OJ题解】最长回文子串

个人主页: 起名字真南的CSDN博客 个人专栏: 【数据结构初阶】 &#x1f4d8; 基础数据结构【C语言】 &#x1f4bb; C语言编程技巧【C】 &#x1f680; 进阶C【OJ题解】 &#x1f4dd; 题解精讲 目录 **题目链接****解题思路****1. 初步判断****2. 回文子串性质****3. 判断是…