聊聊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不断前进的方向和动力,相信在后续的版本中会有更大的进步!
相关文章:
聊聊Oracle自适应查询优化
成也AQO败也AQO 因为工作的原因,我们接触到的客户大部分是金融和运营商行业,这些客户有个最大的特点是追求稳定,对于使用数据库新特性持保守的态度,不会轻易尝试某些可能会导致生产系统不稳定的新特性。上线前通常都会将一些新特…...
MySQL其四,各种函数,以及模拟了炸裂函数创建用户等操作
目录 一、MySQL中的函数 1、IFNULL 2、IF 3、case (难点) 4、exists(难) --存在的意思 二、常见的函数 1、字符串函数 2、数学函数 3、日期函数 (使用频率不是很高) 4、其他函数 5、关于字符集的问题 6、mysql炸裂函数…...
浅谈 php 采用curl 函数库获取网页 cookie 和 带着cookie去访问 网页的方法!!!!
由于近段时间帮朋友开发一个能够查询正方教务系统的微信公众平台号。有所收获。这里总结下个人经验。 开讲前,先吐槽一下新浪云服务器,一个程序里的 同一个函数 在PC测试可以正常运行,在它那里就会挂的现象。 老样子,我将在代…...
ssm-springmvc-学习笔记
简介 简单的来说,就是一个在表述层负责和前端数据进行交互的框架 帮我们简化了许多从前端获取数据的步骤 springmvc基本流程 用户在原本的没有框架的时候请求会直接调用到controller这个类,但是其步骤非常繁琐 所以我们就使用springmvc进行简化 当用…...
nVisual 登录页页面配置说明
一、概述 nVisual登录页面可根据具体客户需要通过public\config\access.js文件进行自定义配置。页面可以大致分为4个部分,头部、底部、可移动区域以及页面中间的信息填写区域。其中头部和底部又包含头部左侧、头部中间、头部右侧、底部左侧、底部中间、底部右侧六个…...
Qt6开发自签名证书的https代理服务器
目标:制作一个具备类似Fiddler、Burpsuit、Wireshark的https协议代理抓包功能,但是集成到自己的app内,这样无需修改系统代理设置,使用QWebengineview通过自建的代理服务器,即可实现https包的实时监测、注入等自定义功能…...
crapy 爬虫框架的使用
1.scrapy框架安装 安装前先安装python3和pycharm 社区版 执行命令安装scrapy, pip install scrapy 2.创建项目 执行命令: scrapy startproject test_spider 如图: 3.使用pycharm大开项目并设置pipenv虚拟机环境 虚拟环境是为了依赖隔…...
Edge SCDN 边缘安全加速有什么用?
Edge SCDN是最新推出的边缘安全加速服务,它是一种融合了安全防护和内容分发加速功能的网络服务技术,通过在网络边缘部署服务器节点,来优化内容的传输和用户的访问体验,同时保障网络安全。 抵御 DDoS 攻击: Edge SCDN …...
使用aarch64-unknown-linux-musl编译生成静态ARM64可执行文件
使用aarch64-unknown-linux-musl编译生成静态ARM64可执行文件 使用aarch64-unknown-linux-musl编译生成静态ARM64可执行文件1. 安装aarch64-unknown-linux-musl目标2. 安装交叉编译工具链安装musl-cross-make 3. 配置Rust编译器使用交叉编译工具链4. 编译你的Rust项目5. 运行或…...
u-boot移植、配置、编译学习笔记【刚开始就中止了】
教程视频地址 https://www.bilibili.com/video/BV1L24y187cK 【这个视频中途停更了…原因是实际中需要去改u-boot的情况比较少】 使用的u-boot的源码 视频中使用的是 u-boot-2017.03 学习到这里,暂停u-boot的移植、配置、编译学习,原因是经过与老师…...
torchaudio.load 段错误
使用 torchaudio.load 时出现崩溃,如图 解决: 安装 ffmpeg conda install ffmpeg -c conda-forge 尝试但没解决问题的方法包括 重装 cuda,重装 pytorch,安装 PySoundFile、SoundFile、sox。...
自定义函数库
求两点距离 double dis(double x1, double y1, double x2, double y2){return sqrt(pow(x2-x1, 2)pow(y2-y1, 2)); }判断闰年 bool isLeapYear(int year){return year%40 && year%100!0 || year%4000; }判断素数 bool isPrime(int num){if(num<2) return false;f…...
Tomcat的下载和使用,配置控制台输出中文日志
目录 1. 简介2. 下载3. 使用3.1 文件夹展示3.1.1 控制台输出乱码 3.2 访问localhost:80803.3 访问静态资源 4. 总结 1. 简介 Tomcat,全称为Apache Tomcat,是一个开源的Web应用服务器和Servlet容器,由Apache软件基金会的Jakarta项目开发。它实…...
STM32应用开发——BH1750光照传感器详解
STM32应用开发——BH1750光照传感器详解 目录 STM32应用开发——BH1750光照传感器详解前言1 硬件介绍1.1 BH1750简介1.2 硬件接线 2 软件编程2.1 软件原理2.1.1 IIC设备地址2.1.2 IIC读写2.1.3 BH1750指令集2.1.4 BH1750工作流程2.1.5 BH1750测量模式 2.2 测试代码2.3 运行测试…...
java jar包加密 jar-protect
介绍 java 本身是开放性极强的语言,代码也容易被反编译,没有语言层面的一些常规保护机制,jar包很容易被反编译和破解。 受classfinal(已停止维护)设计启发,针对springboot日常项目开发,重新编写安全可靠的jar包加壳加密技术,用于保护软件版权。 使用说…...
NMEA/观测文件/导航电文
NMEA-0183 NMEA-0183是美国国家海洋电子协会为海用电子设备制定的标准格式。它包含了定位时间,纬度,经度,高度,定位所用的卫星数,DOP,差分状态和校正时段等很多信息。 参考:GPS NMEA数据包解析…...
HTTPS的工作原理深入解析
在当今互联网时代,网络安全已经成为了一个备受关注的话题。随着越来越多的个人隐私和商业数据被传输在网络中,如何确保这些数据在传输过程中的安全性成为了每个网络开发者和用户关注的核心问题之一。而HTTPS(HyperText Transfer Protocol Sec…...
pandas.core.frame.DataFrame怎么进行对象内容的读写
在 Python 中,pandas.core.frame.DataFrame 是 Pandas 数据库的核心数据结构,可以方便地读取和操作表格数据。以下是几种常见的读取内容的方法: 读取特定列 通过列名获取数据。 # 假设 df 是一个 DataFrame data df["列名"] # …...
OFCA-OpenHarmony人才认证题库答案
单选题 1.[单选题] 位于后台的应用,启动组件需校验的权限是: A: ohos.permission.DISTRIBUTED_DATASYNC B: ohos.permission.START_ABILITIES_FROM_BACKGROUND C: ohos.permission.ABILITY_BACKGROUND_COMMUNICATION D: ohos.permission.START_INVISIBLE_ABIL…...
若依微服务如何获取用户登录信息
文章目录 1、需求提出2、应用场景3、解决思路4、注意事项5、完整代码第一步:后端获取当前用户信息第二步:前端获取当前用户信息 6、运行结果后端测试:前端展示: 总结 1、需求提出 在微服务架构中,获取当前用户的登录信…...
题目 2778: 判断数正负
题目 2778: 判断数正负 时间限制: 2s 内存限制: 192MB 提交: 12161 解决: 6681 题目描述 给定一个整数N,判断其正负。 输入格式 一个整数N(-109 < N < 109) 输出格式 如果N > 0, 输出positive; 如果N 0, 输出zero; 如果N < 0, 输…...
【Hexo】博客自动生成AI摘要
工具介绍 如何让博客支持AI摘要,使用TianliGPT自动生成文章的AI摘要 摘要AI-文章摘要生成工具 文章摘要是一个专业的文字摘要生成工具,你可以将需要提取摘要的文本内容发送给TianliGPT,稍等一会他就可以给你发送一个基于这段文本内容的摘要。…...
vue3-count-to实现数字动态增长效果
vue3-count-to 是一个用于 Vue 3的数字计数动画库,常用于在页面上实现数字的动态增长效果,类似于从某个起始值渐变到目标值的效果。它可以用来显示各种数字、统计数据或展示动画效果。 1 安装 vue3-count-to 首先,你需要安装 vue3-count-to …...
第一课【输入输出】(题解)
1.向世界问好 题目描述 编程输出以下内容: Hello World! Im a C program. 输入格式 本题无输入。 输出格式 请按照样例输出,注意大小写、空格、感叹号,句号,单引号都必须使用英文输入法里的符号。 样例输入/输出 输入数据 1 本题无…...
边缘AI和智能音频专家XMOS全球首家增值经销商(VAR)落地中国
强强合作——XMOS与飞腾云达成全球首家增值经销协议以用智能音频技术和产品服务全球厂商和消费者 中国深圳,2024年12月——全球领先的软件定义系统级芯片(SoC)开发商XMOS宣布:公司已与飞腾云科技达成增值分销协议,授权…...
实战 | 某院校小程序记录
视频教程在我主页简介里 目录: 前言: 渗透思路 1.绕过前端 2.信息泄露 3.爆破用户账号密码 4.信息泄露2 结束 前言: 遇到一个学校小程序的站点,只在前端登录口做了校验,后端没有任何校验,奇葩弱口令离…...
正则表达式——参考视频B站《奇乐编程学院》
智能指针 一、背景🎈1.1. 模式匹配🎈1.2. 文本替换🎈1.3. 数据验证🎈1.4. 信息提取🎈1.5. 拆分字符串🎈1.6. 高级搜索功能 二、原料2.1 参考视频2.2 验证网址 三、用法3.1 限定符3.1.1 ?3.1.2 *3.1.3 3.1.…...
【Vue + Print.js】前端打印, 自定义字体大小, 自定义样式, 封装共享样式
在前端开发中,打印功能是一个常见的需求,尤其是在生成报表、打印用户资料或者导出文档时,通常需要通过前端代码进行打印。Print.js 是一个非常流行的 JavaScript 库,它提供了简单而强大的打印功能,允许你灵活控制打印内…...
python模拟练习第一期
问题一 如果一个数 p 是个质数,同时又是整数 a的约数,则 p 称为 a的一个质因数。 请问 2024 有多少个质因数? 步骤 1: 分解 2024 首先,2024 是偶数,说明可以被 2 整除。我们从 2 开始进行除法分解: 202…...
Java-25 深入浅出 Spring - 实现简易Ioc-01 Servlet介绍 基本代码编写
点一下关注吧!!!非常感谢!!持续更新!!! 大数据篇正在更新!https://blog.csdn.net/w776341482/category_12713819.html 目前已经更新到了: MyBatisÿ…...
华硕奥创软件在线安装和离线安装方法
华硕奥创软件在线安装和离线安装方法 1. 华硕奥创软件介绍2. 华硕奥创软件在线安装2.1 第一种2.2 第二种 3. 华硕奥创软件离线安装3.1 概述3.2 华硕奥创软件离线包下载方式 4. 卸载华硕奥创软件4.1 概述4.2 华硕奥创卸载软件下载与使用方式 结束语 1. 华硕奥创软件介绍 华硕奥…...
AI监控赋能健身馆与游泳馆全方位守护,提升安全效率
一、AI视频监控技术的崛起 随着人工智能技术的不断发展,AI视频监控正成为各行业保障安全、提升效率的关键工具。相比传统监控系统,AI技术赋予监控系统实时分析、智能识别和精准预警的能力,让“被动监视”转变为“主动防控”。 二、AI监控应用…...
SQL Server数据库还原差异备份
适用范围:SQL Server 本主题介绍如何使用 SQL Server Management Studio 或 Transact-SQL 在 SQL Server 中还原差异数据库备份。 限制和局限 不允许在显式或隐式事务中使用 RESTORE。 无法在早期版本的 SQL Server 中还原较新版本的 SQL Server创建的备份。 在…...
Python 给 Excel 写入数据的四种方法
Python 在数据处理领域应用广泛,其中与 Excel 文件的交互是常见需求之一。 本文将介绍四种使用 Python 给 Excel 文件写入数据的方法,并结合生活中的例子进行解释,帮助新手小白快速上手。 1. 使用 openpyxl 库 openpyxl 是一个用于读写 Exc…...
实验14 RNN的记忆能力和梯度爆炸实验
一 循环神经网络的记忆能力 1.数据集构建 创建了一个DigitSumDataset 类,包括初始化函数init、数据生成函数 generate_data、数据加载函数 load_data、__len__ 方法、__getitem__ 方法。 init函数:接受的参数是data_path( 存放数据集的目录…...
【电子通识】电流倒灌为什么需要注意?
电流倒灌是一个很常见的问题,以“IO电流倒灌”为关键词在百度上进行搜索,可以找到很多相关案例。 电流倒灌问题在5V电平的单片机时代几乎不会发生,主要是因为5V单片的IO耐压值高,单片机内部结构对IO保护设计很好。 到了3.3V单片机时代,这类问题有一定的偶发性,但…...
Elasticsearch 集群部署
Elasticsearch 是一个分布式的搜索和分析引擎,广泛应用于日志分析、全文搜索、实时数据分析等场景。它以其高性能、高可用性和易用性而著称。本文档将引导您完成一个基本的 Elasticsearch 集群配置,包括节点间的通信、客户端访问、安全设置等关键步骤。我…...
Windows系统VSCode 搭建ESP-IDF环境
VS Code,安装ESP-IDF插件 快捷键CTRLSHIFTP,弹出显示所有命令的窗口,选择ESP-IDF的欢迎 使用第一个选项,要选择一个ESP-IDF版本,选最新的就行 点击Install,等待下载 提示安装成功,如果过程中出现python已存…...
在centos 7.9上面安装mingw交叉编译工具
1.说明 为了在centos上面编译windows的程序,需要安装mingw工具,mingw工具是可以编译windows程序的一些工具链,使用方式和linux一致 2.下载脚本 使用脚本方式编译,github的脚本位置:https://github.com/Zeranoe/ming…...
【Java笔记】LinkedList 底层结构
一、LinkedList 的全面说明 LinkedList底层实现了双向链表和双端队列特点可以添加任意元素(元素可以重复),包括null线程不安全,没有实现同步 二、LinkedList 的底层操作机制 三、LinkedList的增删改查案例 public class LinkedListCRUD { public stati…...
【深入理解java中的设计模式】
深入理解java中的设计模式 设计模式是软件工程中的最佳实践,它们提供了解决特定问题的模板或蓝图。在Java中,设计模式通常被分为三大类:创建型模式、结构型模式和行为型模式。 创建型模式 单例模式 (Singleton Pattern) 描述: 保证一个类…...
详解下c语言下的多维数组和指针数组
在实际c语言编程中,三维及以上数组我们使用的很少,二维数组我们使用得较多。说到数组,又不得关联到指针,因为他们两者的联系太紧密了。今天我们就详细介绍下c语言下的多维数组(主要是介绍二维数组)和指针。 一、二维数组 1.1&am…...
如何使用 Python 发送 HTTP 请求?
在Python中发送HTTP请求最常用的库是requests,它提供了简单易用的API来发送各种类型的HTTP请求。 除此之外,还有标准库中的http.client(以前叫做httplib)和urllib,但它们相对更底层,代码量较大,…...
活动预告 |【Part2】Microsoft Azure 在线技术公开课:基础知识
课程介绍 参加“Azure 在线技术公开课:基础知识”活动,培养有助于创造新的技术可能性的技能并探索基础云概念。参加我们举办的本次免费培训活动,扩充自身的云模型和云服务类型知识。你还可以查看以计算、网络和存储为核心的 Azure 服务。 课…...
神经网络基础-激活函数
文章目录 1. 什么是激活函数2. sigmoid 激活函数3. tanh 激活函数4. ReLU 激活函数5. SoftMax 激活函数6. 其他常见的激活函数7. 激活函数的选择方法 1. 什么是激活函数 激活函数用于对每层的输出数据进行变换, 进而为整个网络注入了非线性因素。此时, 神经网络就可以拟合各种…...
Debedium如何忽略Oracle的purge命令
报错 截至目前3.0版本,Debezium的Oracle Connector并不支持purge table这个指令。 所以,在使用Debezium解析Oracle变更的时候,如果在源端执行了类似 purge table "$BIN… 的语句,就会导致Debezium罢工,日志里显…...
基于 webRTC Vue 的局域网 文件传输工具
文件传输工具,匿名加密,只需访问网页,即可连接到其他设备,基于 webRTC 和 Vue.js coturn TURN 服务器 docker pull coturn/coturn docker run -d --networkhost \-v $(pwd)/my.conf:/etc/coturn/turnserver.conf \coturn/coturn…...
opencv Canny边缘检测
canny阈值越高,检测到的边缘数量越少 # 导入OpenCV库,用于图像处理 import cv2 import numpy as np # 从matplotlib库中导入pyplot模块,用于绘制图像 from matplotlib import pyplot as plt # 创建一个名为window的窗口,窗口大小自…...
数仓高频面试 | 数仓为什么要分层
大家好,我是大D呀。 关于数仓分层,在面试过程中几乎是必问的。不过,面试官一般也不会直接考你数仓为什么要分层,而是在你介绍项目时,可能会换一种形式来穿插着问,比如数据链路为什么要这样设计,…...
Coconut:探索大语言模型的连续思维链推理能力
目录 简介: 什么是Coconut? 为什么我们需要Coconut? Coconut如何工作? 实验结果怎么样? Coconut的优势: 结论: 简介: 你有没有想过,计算机是如何像人类一样思考问…...