独家揭秘 | 阿里云分析型数据库AnalyticDB新一代CBO优化器技术

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 Tair(兼容Redis),内存型 2GB
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
简介: 作者:马宏,阿里云数据库技术专家

01、概述

对于数据库来说,其中俩个核心的模块是:优化器和执行引擎。优化器负责给执行引擎提供输入,它接收来自 SQL Parser 解析好的 AST 树,然后需要从所有可能的计划中选择代价最优的计划提供给执行引擎。基于代价的优化器本质上是一个复杂的搜索问题,想要解决好这个问题,需要从四个方向入手:

1)搜索框架:既然是搜索问题,那么就需要一个搜索框架来承载这个问题。从数据库的发展历程来看,基于 Cascades 的搜索框架已经成为了业界标准,包括商业数据库 SQL Server 以及开源数据库 GP/ORCA 都采用 Cascades 实现。AnalyticDB CBO 也是基于 Cascades 论文实现的。

2)分布式并行计划:相对于传统的单机版数据库,AnalyticDB 是一个分布式 MPP 数据库,优化器生成的计划是一个分布式并行计划。因此需要把分布式并行计划的生成和搜索框架结合起来,基于代价选择最佳的分布式并行计划。

3)代价估算:代价估算是优化器能否寻找到最优计划的关键因素,代价估算做不好,优化器不可能做好。代价估算涉及到统计信息的推导和代价模型。统计信息的推导依赖于:原始表的统计信息、中间算子的推导算法、对数据的各种假设(均匀性假设、独立性假设、包括性假设、包含性假设)以及在一些极端情况下的猜测。因此统计信息的推导存在大量的不确定性,也正是因为这些不确定性,极大的加剧了优化器寻找最优解的难度。

4)统计信息收集:收集必要的统计信息是 CBO 工作的前提,CBO 和统计信息之间的关系犹如一把枪和弹药之间的关系,枪再好如果没有充足的弹药的话,那么无异于巧妇难为无米之炊。统计信息需要做到:基本信息能够自动化收集,自动化更新,高级统计信息可以手动收集,为 CBO 提供可靠的、多维度的统计信息。

02、架构

1.jpg

搜索框架

搜索框架在整个 CBO 中处于非常中心的一个位置,它会调用 Property Enforcement 框架,生成分布式执行计划,然后调用代价估算模块,给每一种候选分布式执行计划评估代价,最终基于代价选择最优的分布式执行计划。搜索框架包括以下几个部分:

Memo 表示搜索空间:对于一个查询计划来说,首先需要把它初始化,形成初始化的搜索空间。随着搜索的进行,搜索空间会不断扩充。由于搜索空间会非常庞大,因此 Memo 需要做到高效存储。

Search 表示搜索算法:搜索算法由三部分组成,第一部分用于递归遍历搜索空间,第二部分用于调用展开规则产生新的等价候选计划,扩充搜索空间,第三分部用于用于推导分布式计划的属性要求并计算代价值,进而寻求最优的分布式执行计划。

Scheduler 表示调度搜索算法的调度器:在当前的 AnalyticDB CBO 版本中,基于单线程和栈实现:把搜索任务压入到一个栈中,然后循环取栈中的任务去执行,直到任务结束。

考虑到其他开源优化器产品,例如 ORCA 提到了多线程并行搜索的理念,我们预留了多线程调度器的接口,相对于优化器众多棘手的问题来说,它的优先级并不是那么高,实现并行搜索的好处是非常明显的,它可以显著降低任务调度的执行时间,充分发挥多核并行的能力,从整个查询的角度来看,可以缩短查询优化的耗时,从而降低整体查询的耗时。但是并行搜索带来的线程同步问题,以及线程间依赖处理问题,挑战还是很大的。

Rule 表示展开规则:展开规则用于生成等价候选计划,等价候选计划会被放入到 Memo 中,形成完整的搜索空间。展开规则决定了优化器可以展开多少种候选计划,因此展开规则的种类,以及每种展开规则的算法效率对 CBO 来说也是至关重要的。展开规则种类越多,搜索空间就越完善,也就更有可能寻求到最优解,同时每种展开规则的算法越高效,生成完整的搜索空间就越高效,查询优化就越快。

分布式并行计划

相对于传统的单机版数据库来说,分布式 MPP 数据库给优化器带来了新的挑战。在分布式 MPP 数据库中,数据的分布属性变得十分的重要,它会直接影响到数据的正确性。为了满足不同算子对数据分布的要求,我们往往需要做数据重分布。

然而数据的重分布,也就是数据 shuffle 的代价非常昂贵,因此,在保证数据正确性的前提下,尽可能的减少数据 shuffle,可以大幅度提升分布式计划的执行性能。作为分布式 MPP 数据库优化器来说,需要把数据的 Partitioning 属性,以及 Sorting、Grouping 属性,也纳入到搜索空间来综合考虑,基于代价选择最优的分布式并行执行计划。

因此我们设计实现了一套完整的 Property Enforcement 框架,用于描述在分布式场景下,分布式计划对数据分布的要求。同时我们把 Property Enforcement 的过程和搜索框架无缝的结合在一起,实现了面向分布式 MPP 数据库的 CBO。

代价估算

代价估算是整个 CBO 质量好坏的关键因素,代价估算做的好,CBO 才有可能选择出最优的计划,它包括三个部分。

Statistics 用于描述原始表的统计信息。包括表级别的统计信息 Row Count,单个字段的统计信息:每个字段的 NDV 值(distinct 值),Max 值,Min 值,NULL 值,Histogram 值(分布信息,用于区间查询), Count-Min Sketch 值(用于等值查询),DataSize 值。这些统计信息我们把它归纳为基础统计信息,需要做到自动收集,自动更新。

同时考虑到多个字段之间的关联度、Functional deplendency、数据的倾斜等这些因素对统计信息估算的影响,还会提供命令行工具,手动收集这些信息,对于这些需要手动收集的信息,我们把它归纳为高级统计信息,只有在必要的时候,才需要显示的手动收集。另外,对于一些复杂的 predicate,例如 like,那么即使收集了 Histogram 也无法支持这种场景,因此我们也会在运行时基于动态采样来获取对应的统计信息。

Stats Derivation 用于推导经过各个算子之后的统计信息。统计信息的推导依赖于原始表的统计信息,数学公式,对数据属性的假设(例如,数据的分布是均匀的,多列之间的选择率是没有相关性的),以及极端情况下,启发式的假设(例如对于一个用户自定义的 UDF,它的选择率只能给一个默认值)。

统计信息的推导的好坏对优化器来说至关重要,这也一直是学术界的研究热点。本质上来说,只有打破对数据属性的假设,才有可能使得统计信息的估算做到知其然知其所以然,然而打破这些假设,依赖于对原始数据的分析,生成更多维度的统计信息,必然也要付出更多的代价。

Cost Model 表示代价模型。代价模型的工作必须要建立在合理的统计信息推导的基础之上,否则它的意义不会很大。代价模型需要对实际的计算模型进行评估,把统计信息转换为可以量化的代价值,从而为优化器提供决策依据。

统计信息收集

Analyze 用于收集统计信息。对于商业数据库来说,为了提升用户体验,做到开箱即用,都致力于 Auto analyze,即统计信息收集的自动化,以及自动更新。但是收集本身也是有代价的,因此我们把统计信息分为俩类:基础统计信息和高级统计信息。

基础统计信息就是前面提到的:表级别的统计信息 row count,单个字段的统计信息:每个字段的 NDV 值(distinct 值),Max 值,Min 值,NULL 值,Histogram 值(分布信息,用于区间查询),Count-Min Sketch 值(用于等值查询),DataSize 值。基础统计信息必须要做到自动化收集、自动化更新,否则很可能由于这些统计信息的缺失,导致优化器产生灾难性的计划。

同时为了提升优化器在复杂情况下的决策质量,还提供了一些高级的命令用于收集更加复杂的统计信息,例如可以收集 column group 的统计信息,来获取多个字段之间的关联度信息。高级统计信息需要手工触发收集,只有在必要的时候才会收集。

基于 Analyze 命令收集统计信息,无论是自动化收集,还是手工收集,本质上来说所,它都是一个独立的进程:Analyze 会调用 Data Profiling 任务,对原始数据进行分析,生成统计信息,并存储在 Metadata 库中。

考虑到实际情况下,可能存在一些非常复杂的查询条件,不管是基础的统计信息还是高级统计信息,都无法很好的对它做合理的估算,这个时候,dynamic sampling 动态采样就可以发挥它的价值,动态采样会实时下发采样,获取必要的统计信息,提升优化器的决策质量。

其次,动态采样也可以作为统计信息收集的一种兜底策略,当基础统计信息由于某些原因导致未收集的情况下,动态采样的存在可以避免优化器由于缺失统计信息而产生灾难性的计划。但是动态采样是在查询优化阶段同步阻塞执行的,因此它必然会增加查询优化的整体耗时,同时也会增加整个数据库系统的负载,因此我们严格限制动态采样的使用场景。

03、设计与实现

接下来我们会通过一个例子来展开搜索框架、Property Enforcement 框架、以及代价估算的设计与实现。

查询语句

这一个简化版的 TPCH q3,非常典型的三表 Join。其中 customer 表按照 c_custkey 进行分区,orders 表按照o_orderkey 进行分区,lineitem 表按照 l_orderkey 进行分区。

SELECT
    l_orderkey,
    o_orderdate,
    o_shippriority
FROM
    customer,
    orders,
    lineitem
WHERE
    c_custkey = o_custkey
    AND l_orderkey = o_orderkey

查询优化

在进入到 CBO 之前,原始的执行计划如下图所示,customer 表和 orders 表先 Join,Join 的结果再和 lineitem 表 Join,然后输出结果。

2.jpg

进入到 CBO 后,首先需要把查询计划转换为 Group 和 GroupExpression,并初始化 Memo 搜索空间。可以看到共有 6 个 Group,每个 Group 都有一个 GroupExpression。Group 和 GroupExpression 都是搜索空间里面的重要概念,关于它的详细介绍可以参考:AnalyticDB Cost based Optimizer 搜索框架,这里不展开。

简单来说:对于逻辑等价的,可以产生相同结果的 Logical Expression 和 Physical Expression 的集合称为 Group,GroupExpression 则包括 Logical GroupExpression 和 Physical GroupExpression,每一种 GroupExpression 表示一种等价候选计划。
3.jpg

在这里,我们为了简化描述,只考虑 Join 的 Order,以及分布式 Join 情况下,Repartition Join 和 Replicate Join 这两种属性要求,对于 Join 的算法默认只考虑 Hash-join 物理实现。

其他算子:TableScan 和 Output 也默认只有一种物理实现。调度器调度搜索任务,执行搜索流程,扩展搜索空间。可以看到随着搜索算法的不断迭代,Memo 里面的 Group 和 GroupExpression 会新增:白色表示 Logical GroupExpression,灰色表示 Physical GroupExpression。

可以看到,在应用了 Join 的结合律之后,新产生了 Group7 和 Group8 这俩个 Group;同时应用了 Join 的交换律之后,Group5 和 Group3 里面新增了很多等价的 Logical GroupExpression;同样 Group7 和 Group8 里面也有等价的 Logical GroupExpression。

4.jpg

最终考虑俩种分布式 Join 实现:Repartition Join 和 Replicate Join,这样就生成了完整的搜索空间。

5.jpg

当整个搜索空间被完整的扩充出来之后,接下来需要调用 Property Enforcement 框架,对每一种物理执行计划,去 Enforce 必要的属性,从而满足分布式执行计划的要求,然后再调用代价估算模块,去计算每一种分布式计划的代价,并把代价最小的计划标记为最优解,也就是 Winner。当每一个 Group 的 Winner 都被计算出来之后,将每个 Winner 串接起来,就是最优的分布式执行计划。

关于 Property Enforcement 和代价估算的详情,可以参考下面这三篇文章,这里不展开。

AnalyticDB Cost based Optimizer 分布式并行计划
AnalyticDB Cost based Optimizer 代价估算
AnalyticDB Cost based Optimizer 统计信息收集

下图中黑色意味着 Winner,表示的是在满足某种属性要求的情况下,代价最低最低的物理执行计划。

6.jpg
7.jpg

我们遍历每个 Group 的 Winner,将 Winner 串接起来,就形成了最优的分布式执行计划。

每一个 Winner 经过 Property Enforcement 之后,都会在必要的时候插入必要的 Exchange 节点,来满足分布式计划的属性要求,所以生成的分布式执行计划如下图所示。可以看到:首先 customer 表做了一个全表广播到所有节点,进而满足和 orders 表 Join 的要求,Join 之后的结果按照 order 表分布,orders 表和 lineitem 表数据分布本身就满足 Join 的要求,因此不需要插入 Exchange 节点,最终 Join 的结果要输出到 Output 节点,因此插入 Gather 节点,汇总到单节点。

7.jpg

04、参考

An Overview of Query Optimization in Relational Systems

The Cascades Framework for Query Optimization
Efficiency in the columbia database query optimizer

Orca: A Modular Query Optimizer Architecture for Big Data

Incorporating Partitioning and Parallel Plans into the SCOPE Optimizer

Profiling Relational Data – A Survey

相关实践学习
AnalyticDB MySQL海量数据秒级分析体验
快速上手AnalyticDB MySQL,玩转SQL开发等功能!本教程介绍如何在AnalyticDB MySQL中,一键加载内置数据集,并基于自动生成的查询脚本,运行复杂查询语句,秒级生成查询结果。
阿里云云原生数据仓库AnalyticDB MySQL版 使用教程
云原生数据仓库AnalyticDB MySQL版是一种支持高并发低延时查询的新一代云原生数据仓库,高度兼容MySQL协议以及SQL:92、SQL:99、SQL:2003标准,可以对海量数据进行即时的多维分析透视和业务探索,快速构建企业云上数据仓库。 了解产品 https://www.aliyun.com/product/ApsaraDB/ads
目录
相关文章
|
3月前
|
机器学习/深度学习 算法 数据可视化
如果你的PyTorch优化器效果欠佳,试试这4种深度学习中的高级优化技术吧
在深度学习领域,优化器的选择对模型性能至关重要。尽管PyTorch中的标准优化器如SGD、Adam和AdamW被广泛应用,但在某些复杂优化问题中,这些方法未必是最优选择。本文介绍了四种高级优化技术:序列最小二乘规划(SLSQP)、粒子群优化(PSO)、协方差矩阵自适应进化策略(CMA-ES)和模拟退火(SA)。这些方法具备无梯度优化、仅需前向传播及全局优化能力等优点,尤其适合非可微操作和参数数量较少的情况。通过实验对比发现,对于特定问题,非传统优化方法可能比标准梯度下降算法表现更好。文章详细描述了这些优化技术的实现过程及结果分析,并提出了未来的研究方向。
45 1
|
3月前
|
人工智能 自然语言处理 关系型数据库
阿里云云原生数据仓库 AnalyticDB PostgreSQL 版已完成和开源LLMOps平台Dify官方集成
近日,阿里云云原生数据仓库 AnalyticDB PostgreSQL 版已完成和开源LLMOps平台Dify官方集成。
|
3月前
|
人工智能 分布式计算 数据管理
阿里云位居 IDC MarketScape 中国实时湖仓评估领导者类别
国际数据公司( IDC )首次发布了《IDC MarketScape: 中国实时湖仓市场 2024 年厂商评估》,阿里云在首次报告发布即位居领导者类别。
|
3月前
|
SQL 分布式计算 数据挖掘
加速数据分析:阿里云Hologres在实时数仓中的应用实践
【10月更文挑战第9天】随着大数据技术的发展,企业对于数据处理和分析的需求日益增长。特别是在面对海量数据时,如何快速、准确地进行数据查询和分析成为了关键问题。阿里云Hologres作为一个高性能的实时交互式分析服务,为解决这些问题提供了强大的支持。本文将深入探讨Hologres的特点及其在实时数仓中的应用,并通过具体的代码示例来展示其实际应用。
285 0
|
4月前
|
运维 数据挖掘 OLAP
阿里云Hologres:一站式轻量级OLAP分析平台的全面评测
在数据驱动决策的今天,企业对高效、灵活的数据分析平台的需求日益增长。阿里云的Hologres,作为一站式实时数仓引擎,提供了强大的OLAP(在线分析处理)分析能力。本文将对Hologres进行深入评测,探讨其在多源集成、性能、易用性以及成本效益方面的表现。
213 7
|
8月前
|
达摩院 Linux 决策智能
阿里达摩院MindOpt优化求解器-月刊(2024年3月)
### MindOpt 优化求解器月刊(2024年3月) - 发布亮点:MAPL建模语言升级至V2.4,支持云上无安装使用和向量化建模语法。 - 新增功能:Linux用户可本地安装`maplpy`,并支持Python与MAPL混编。 - 实例分享:介绍背包问题的组合优化,展示如何在限定容量下最大化收益。 - 用户投稿:探讨机票超售时的最优调派策略,以最小化赔付成本。 - 加入互动:官方钉钉群32451444,更多资源及。 [查看详细内容](https://opt.aliyun.com/)
134 0
阿里达摩院MindOpt优化求解器-月刊(2024年3月)
|
8月前
|
机器学习/深度学习 达摩院
阿里达摩院MindOpt优化求解器-月刊(2024年4月)
【摘要】2024.04.30,阿里云发布了MindOpt优化求解器的新商品和功能。MindOpt现在已上架,提供超低价零售求解器,支持按需购买,可在阿里云平台上直接购买联网或不联网License。新版本V1.2发布,提升MILP性能,并增加PostScaling参数。此外,MindOpt Studio推出租户定制版,正处于邀测阶段。同时分享了使用MindOpt解决二分类SVM问题的案例。更多内容,可访问相关链接。
178 0
|
5月前
|
达摩院 供应链 安全
光储荷经济性调度问题【数学规划的应用(含代码)】阿里达摩院MindOpt
本文介绍使用MindOpt工具优化光储荷经济性调度的数学规划问题。光储荷经济性调度技术旨在最大化能源利用率和经济效益,应用场景包括分布式光伏微网、家庭能源管理系统、商业及工业用电、电力市场参与者等。文章详细阐述了如何通过数学规划方法解决虚拟电厂中的不确定性与多目标优化难题,并借助MindOpt云建模平台、MindOpt APL建模语言及MindOpt优化求解器实现问题建模与求解。最终案例展示了如何通过合理充放电策略减少37%的电费支出,实现经济与环保双重效益。读者可通过提供的链接获取完整源代码。
|
5月前
|
达摩院 BI 索引
切割问题【数学规划的应用(含代码)】阿里达摩院MindOpt
本文主要讲述了使用MindOpt工具对切割问题进行优化的过程与实践。切割问题是指从一维原材料(如木材、钢材等)中切割出特定长度的零件以满足不同需求,同时尽可能减少浪费的成本。文章通过实例详细介绍了如何使用MindOpt云上建模求解平台及其配套的MindOpt APL建模语言来解决此类问题,包括数学建模、代码实现、求解过程及结果分析等内容。此外,还讨论了一维切割问题的应用场景,并对其进行了扩展,探讨了更复杂的二维和三维切割问题。通过本文的学习,读者能够掌握利用MindOpt工具解决实际切割问题的方法和技术。
|
5月前
|
达摩院 算法 安全
智慧楼宇多目标调度问题【数学规划的应用(含代码)】阿里达摩院MindOpt
本文探讨了使用MindOpt工具优化智慧楼宇的多目标调度问题,特别是在虚拟电厂场景下的应用。智慧楼宇通过智能化技术综合考虑能耗、舒适度等多目标,实现楼宇设备的有效管理和调度。虚拟电厂作为多能源聚合体,能够参与电力市场,提供调峰、调频等辅助服务。文章介绍了如何使用MindOpt云上建模求解平台及MindOpt APL建模语言对楼宇多目标调度问题进行数学建模和求解,旨在通过优化储能设备的充放电操作来最小化用电成本、碳排放成本和功率变化成本,从而实现经济、环保和电网稳定的综合目标。最终结果显示,在使用储能设备的情况下,相比不使用储能设备的情形,成本节约达到了约48%。