聊聊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不断前进的方向和动力,相信在后续的版本中会有更大的进步!

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

电脑显示器选购指南2024

选择显示器是五花八门的显示参数,如何选择,以下给出参数说明,及部分参考: 1. 尺寸和分辨率 尺寸(英寸) 根据使用距离和用途选择合适的屏幕尺寸: 21-24 英寸:适合小桌面空间、日常…

(八)机器学习 - 线性回归

线性回归(Linear Regression)是一种统计学方法,用于建立一个或多个自变量(解释变量)与因变量(响应变量)之间的线性关系。线性回归的目的是通过最小化预测误差来找到最佳的线性拟合模型&#xff…

huggingface NLP-微调一个预训练模型

微调一个预训练模型 1 预处理数据 1.1 处理数据 1.1.1 fine-tune 使用tokenizer后的token 进行训练 batch tokenizer(sequences, paddingTrue, truncationTrue, return_tensors"pt")# This is new batch["labels"] torch.tensor([1, 1])optimizer A…

Unity NTPComponent应用, 实现一个无后端高效获取网络时间的组件

无后端高效获取网络时间的组件 废话不多说,直接上源码m_NowSerivceTime 一个基于你发行游戏地区的时间偏移, 比如北京时区就是 8, 巴西就是-3,美国就是-5using Newtonsoft.Json; 如果这里报错, 就说明项目没有 NewtonsoftJson插件…

华为ensp中nat server 公网访问内网服务器

作者主页:点击! ENSP专栏:点击! 创作时间:2024年4月15日17点30分 💯趣站推荐💯 前些天发现了一个巨牛的🤖人工智能学习网站,通俗易懂,风趣幽默,…

R语言学习笔记-1

1. 基础操作和函数 清空环境:rm(list ls()) 用于清空当前的R环境。 打印输出:print("Hello, world") 用于输出文本到控制台。 查看已安装包和加载包: search():查看当前加载的包。install.packages("package_na…

二、FIFO缓存

FIFO缓存 1.FIFO缓存介绍2.FIFO缓存实现3.FIFO缓存总结 1.FIFO缓存介绍 FIFO(First-In-First-Out)缓存 是一种简单的缓存淘汰策略,它基于先进先出的原则来管理数据。当缓存达到容量限制并需要淘汰元素时,最先进入缓存的元素会被移…

Spring Cloud与Spring Cloud Alibaba:全面解析与核心要点

Spring Cloud与Spring Cloud Alibaba:全面解析与核心要点 一、引言 在当今的分布式系统开发领域,Spring Cloud和Spring Cloud Alibaba都是极为重要的框架。它们为构建大规模、高可用、分布式的应用系统提供了丰富的工具和组件。本文将深入探讨Spring C…

账号下的用户列表表格分析

好的,这是您提供的 el-table 组件中所有列的字段信息,以表格形式展示: 列标题 (label)字段属性 (prop)对齐方式 (align)宽度 (width)是否可排序 (sortable)说明IDidcenter100否管理员的唯一标识符头像avatarcenter90否管理员的头像 URL 或路…

GPT-SoVITS语音合成模型部署及使用

1、概述 GPT-SoVITS是一款开源的语音合成模型,结合了深度学习和声学技术,能够实现高质量的语音生成。其独特之处在于支持使用参考音频进行零样本语音合成,即使没有直接的训练数据,模型仍能生成相似风格的语音。用户可以通过微调模…

TongWe7.0-东方通TongWeb控制台无法访问 排查

问题描述:无法访问TongWeb的控制台 逐项排查: 1、控制台访问地址是否正确:http://IP:9060/console #IP是服务器的实际IP地址 2、确认TongWeb进程是否存在,执行命令:ps -ef|grep tongweb 3、确认TongWeb服务启动…

研发文档管理系统:国内外9大选择比较

文章主要对比了9款国内外研发文档管理系统:1.PingCode; 2. Worktile; 3. 飞书; 4. 石墨文档; 5. 腾讯文档; 6. 蓝湖; 7. Confluence; 8. Notion; 9. Slab。 在企业研发过…

【ABAP SAP】开发-BUG修补记录_采购申请打印时品名规格品牌为空

项目场景: TCODE:自开发程序ZMMF004 采购申请打印 问题描述 ZMMF004打印的时候,有的采购申请的品名、规格、品牌为空 原因分析: 1、首先我通过写SQL语句查底表来看这几条采购申请本身有无品名、规格、品牌 SQL语句如下,只需修…

Ubuntu 20.04 24.04 双网卡 Bond 配置指南

前言:在现代服务器管理中,网络的稳定性和可靠性至关重要。为了提高网络的冗余性和负载能力,我们经常需要配置多个网络接口以实现链路聚合或故障转移。Ubuntu系统自17.10版本起,引入了Netplan作为新的网络配置抽象化工具&#xff0…

OCR实践—PaddleOCR

有个项目需求,对拍摄的问卷图片,进行自动得分统计【得分是在相应的分数下面打对号】,输出到excel文件 原始问卷文件见下图,真实的图片因使用手机拍摄的图片,存在一定的畸变, 技术调研 传统方法 传统方法…

ubuntu+ros新手笔记(五):初探anaconda+cuda+pytorch

深度学习三件套:初探anacondacudapytorch 系统ubuntu22.04 ros2 humble 1.初探anaconda 1.1 安装 安装过程参照【详细】Ubuntu 下安装 Anaconda 1.2 创建和删除环境 创建新环境 conda create -n your_env_name pythonx.x比如我创建了一个名为“py312“的环境…

【测试】Pytest

建议关注、收藏! 目录 功能pytest 自动化测试工具。 功能 单元测试:用于验证代码的最小功能单元(如函数、方法)的正确性。 简单的语法:不需要继承特定类或使用复杂的结构。断言语句简化。 自动发现测试:P…

Unity性能优化---使用SpriteAtlas创建图集进行批次优化

在日常游戏开发中,UI是不可缺少的模块,而在UI中又使用着大量的图片,特别是2D游戏还有很多精灵图片存在,如果不加以处理,会导致很高的Batches,影响性能。 比如如下的例子: Batches是9&#xff0…

环境和工程搭建

1.案例介绍 1.1 需求 实现⼀个电商平台 该如何实现呢? 如果把这些功能全部写在⼀个服务⾥, 这个服务将是巨⼤的. 巨多的会员, 巨⼤的流量, 微服务架构是最好的选择. 微服务应⽤开发的第⼀步, 就是服务拆分. 拆分后才能进⾏"各⾃开发" 1.2 服务拆分 拆分原则 …

解决Jmeter HTTP Cookie管理器cookie不生效

解决Jmeter HTTP Cookie管理器cookie不生效问题 解决Jmeter HTTP Cookie管理器cookie不生效问题1、设置Jmeter HTTP Cookie管理器cookie后,发起的请求显示[no cookies]jmeter问题复现:这里同样使用postman进行重试,发现是可以正常获取数据的&…