OceanBase查询优化器

简介: 本文整理自OceanBase团队高级技术专家王国平,在深入浅出 OceanBase线上技术沙龙第二期的分享。

OceanBase查询优化器

摘要:本文整理自OceanBase团队高级技术专家王国平,在深入浅出 OceanBase线上技术沙龙第二期的分享。

本篇内容主要分为四个部分:

1.查询优化器简介

2.查询改写

3.查询优化

4.统计信息和代价模型

 

一、查询优化器简介


image.png


查询优化器是关系数据库系统的核心模块,是数据库内核开发的重点和难点,也是衡量整个数据库系统成熟度的“试金石”。查询优化理论诞生距今已有四十来年,学术界和工业界其实已经形成了一套比较完善的查询优化框架。


image.png


查询优化器从诞生以来一共出现了两大框架。第一个是Volcano/Cascade Style框架,第二个是System-R Style框架。


image.png


查询优化器的整个框架以规则的形式展示给用户。主要分为两大类,即逻辑规则和物理规则。


其中,逻辑规则本质是关系代数,把一个逻辑计划转化成为另一个等价的逻辑执行计划;物理规则会涉及到物理实现。


在这个框架里,Volcano/Cascade Style有两个优点:

第一,扩展性。数据库里的任何优化都可以通过上述规则实现;

第二,Top-down DP算法。它会提前生成一些计划,作为后续计划的解释。


Volcano/Cascade Style的缺点在于复杂的规则体系管理,导致大量重复计划生成。除此之外,它很难找到一个最小规则集合。


image.png


上图是OceanBase查询优化器总体框架。左边包括查询改写和计划生成。其中,计划生成主要包含基表访问路径选择;连接顺序和连接算法和其它算子分配。


右边包括计划缓存,自适应计划匹配,计划演进,主要属于计划管理范畴。


image.png


接下来,看看OceanBase的查询优化器是如何执行的?首先,外部进入一条SQL语句,经过Parser/Resolver,转化成为内部结构Statement。其本质是用来描述原始查询的数据结构,主要包括SELECT LISTFROM LISTWHERE LIST等具体内容。


改写查询主要在数据结构上实现。查询改写会输出另一个Statement结构。在计划生成时,优化器会用这个Statement,生成一个总体的逻辑执行计划。然后,将其翻译成物理执行计划,从而输出最终计划。


image.png


如上图所示,左边的查询列表里有三张表的连接,即t1,t2,t3。查询优化器识别执行计划。执行计划最终会转换成对应的物理执行计划,从而输出最终计划。


二、查询改写


image.png


优化器里面比较重要的模块是查询改写模块。查询改写模块也是优化器的难点和重点。因为SQL是一种描述性的语言,所以为了获取同一个查询结果,不同的用户会写出不同的SQL。查询改写的目的是把“用户的好SQL”转化成为,更加易于优化的SQL


image.png


如果改写的SQL不等价,意味着返回结果可能不准确。在OceanBase里,工作人员每次做改写规则时,必须确定其语义上是等价的。有时需要从关系代数的角度,证明改写规则是正确的。其次,设计的改写规则,必须能够识别出用户写的每一个SQL


image.png


查询改写在模式匹配方面,必须保证其完整性;在等价变化方面,必须保证其正确性。只有基于规则和代价,才能判断查询改写是否有效。


image.png


OceanBase基于规则的改写,总是把SQL往好的方向改写。其主要特点是触发这类改写总能生成更好的执行计划,这类改写算法总是有效的。这类算法的整体流程是匹配模式,执行改写。


image.png


基于代价的改写,其主要特点是某些场景下改写后能生成更好的执行计划,有些场景下不能。是否可以触发这类改写,需要根据实际的数据分布、是否有合适的索引等因素来判断。


image.png


查询改写本质是Statement。在改写模块,有很多基于规则的改写。OceanBase有一个改写迭代策略的迭代器,通过不断迭代改写规则直至收敛。综上所述,OceanBase的查询改写框架,是基于代价跟规则的改写框架。


image.png


近年来,OceanBase不断从业务中,提炼并积累了各式各样的查询改写规则。有基于规则的常量折叠,SPJ和非SPJ的视图合并,连接消除等。也有基于代价的Or-expansionGroup by replacement,窗口函数改写等。


image.png


OceanBase里,如果想要扩展一个改写规则,只需要继承一个类,实现一个Class里的虚函数接口。同时,利用改写的基础算法,很容易实现改写扩展。业务的复杂SQL,是查询改写的试金石跟原动力。目前,在OceanBase4.0中,已经有四十个改写规则框架。


三、查询优化


image.png


接下来,讲一下OceanBase的物理优化器。主包含两大部分,即计划枚举和代价计算。计划枚举包括计划形状的Deep Tree,Bushy Tree;以及枚举算法的DPGreedy Algorithm。代价计算包括统计信息,选择率计算和中间结果估计,以及代价模型。


image.png


计划枚举是一个有确定性的算法。如果有三种连接方式,就会出现六个执行计划。每个执行计划都会计算代价,最终选择代价最小的执行计划。


image.png


在新型查询下,如果超过25张表,没有数据能枚举出来。其逻辑执行计划已经到了2亿级别。从另一个角度看,查询优化器从来都不是选择最优计划,而是避免最差计划。


image.png


OceanBase里,如果基表个数小于十张,会使用动态规划算法。首先,枚举所有一张表的执行计划;然后,枚举两张表的执行计划;接着,枚举三张表的执行计划,以此类推。如果超过十张基表,在开源版本会有启发式的算法,快速收敛执行计划。


image.png


OceanBase执行计划举时,主要维护代价最小的计划和interesting order计划。如上图所示,总共有三个索引路径:p1,p2,p3


索引a的执行时间是十秒;索引b的执行时间也是十秒;主表的执行计划时间是五秒。此时,由于主表代价最小的,p1是有序索引。故保留p1p3


image.png


如上图所示,做完ST,计划连接枚举之后,得出两个计划。分配Group By之后,有四个执行计划。最终,保留代价最小的以及interesting order的计划。所以计划分配的过程是比较有逻辑的。


image.png


OceanBase是分布式数据库,其分布式的计划优化没有特别的地方。在分布式场景下,有Partition Wise JoinPartial Partition Wise JoinHash-Hash Distribution JoinBroadcast Distribution Join等。


image.png


如今的分布式场景,不再是给每个算子选择单机算法,而是给每个算子选择分布式算法。所以分布式的计划优化,本质是选择分布式的算子算法。


image.png


分布式计划优化的第一阶段,是基于所有表都是本地的假设生成一个最优计划。第二阶段是并行优化, 基于代价来选择算子的分布式算法。


image.png


如上图所示,左边是单机算法。在并行优化的过程中,OceanBase把单机算法变成分布式算法,通过分配和选择算子的分布式算法。


image.png


二阶段分布式计划优化的优点在于,计划优化复杂性降低。其缺点在于搜索空间变小,计划次优。所以在OceanBase4.0的版本里,两阶段分布式计划变成了一阶段,提升了整个计划的质量。


四、统计信息和代价模型


image.png


OceanBase的统计信息包括表级别统计信息,列级别统计信息。目前,开源版本没有直方图统计信息。动态采样,执行反馈会在4.0版本出现,现在正在开发当中。


image.png


目前,开源版本的统计信息收集只能通过每日合并。由于它是增量收集,无法改制删除。索引统计信息会随着数据的删除,越来越不准。


3.2以上的版本,支持自动/手动触发。除了收集统计信息,还有统计信息的管理功能,包括统计信息锁定、导入、导出。


image.png


存储层的估行接口实时性很好,通过给定一个索引键值的范围,存储层会返回相对应的行数信息。基线数据按照索引rowkey顺序组织,增的数据是按照索引rowkeyB+树形式组织。


image.png


假设基线数据里面有10万行,但在增量数据里,删除了5万行。此时,如果优化器用传统的方式估算,只能得出数据剩下5万行。


为了解决此类问题,OceanBase引入了物理行跟逻辑行。物理行是基线和增量中需要访问的行数,用来计算索引顺序扫描代价。逻辑行是合并之后的行数,用来计算回表代价。


image.png


物理行与逻辑行在OceanBase里是如何计算的?增量修改在内存中,通过动态采样进行计算。基线数据在固态盘中,利用元数据计算基线行数。相比传统的代价模型,实时的统计信息通过基线+增量的方式,解决了索引列上谓词依赖关系。


image.png


计算一个计划的代价,是通过计算每一个算子的代价,以及每一个算子的输出行长,输出行数。通过础统计信息或直方图,进行动态采样,执行反馈,最终通过选择率计算,估计中间结果行数。

相关文章
|
SQL 算法 数据库
OceanBase 查询优化 | 学习笔记
快速学习 OceanBase 查询优化
OceanBase 查询优化 | 学习笔记
|
6月前
|
关系型数据库 MySQL 数据库
实时计算 Flink版产品使用合集之支持将数据写入 OceanBase 数据库吗
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
135 5
|
3月前
|
存储 SQL 分布式数据库
OceanBase 入门:分布式数据库的基础概念
【8月更文第31天】在当今的大数据时代,随着业务规模的不断扩大,传统的单机数据库已经难以满足高并发、大数据量的应用需求。分布式数据库应运而生,成为解决这一问题的有效方案之一。本文将介绍一款由阿里巴巴集团自主研发的分布式数据库——OceanBase,并通过一些基础概念和实际代码示例来帮助读者理解其工作原理。
253 0
|
27天前
|
SQL 存储 人工智能
OceanBase CTO杨传辉谈AI时代下数据库技术的创新演进路径!
在「DATA+AI」见解论坛上,OceanBase CTO杨传辉先生分享了AI与数据库技术融合的最新进展。他探讨了AI如何助力数据库技术演进,并介绍了OceanBase一体化数据库的创新。OceanBase通过单机分布式一体化架构,实现了从小规模到大规模的无缝扩展,具备高可用性和高效的数据处理能力。此外,OceanBase还实现了交易处理、分析和AI的一体化,大幅提升了系统的灵活性和性能。杨传辉强调,OceanBase的目标是成为一套能满足80%工作负载需求的系统,推动AI技术在各行各业的广泛应用。关注我们,深入了解AI与大数据的未来!
|
3月前
|
Oracle 架构师 分布式数据库
OceanBase数据库的发展历程是什么?
【8月更文挑战第11天】OceanBase数据库的发展历程是什么?
167 63
|
3月前
|
Oracle 关系型数据库 MySQL
OceanBase数据库简介
【8月更文挑战第9天】OceanBase数据库简介
336 60
|
3月前
|
Oracle 关系型数据库 MySQL
OceanBase 与传统数据库的对比
【8月更文第31天】随着云计算和大数据技术的发展,分布式数据库因其高扩展性、高可用性和高性能而逐渐成为企业和开发者关注的焦点。在众多分布式数据库解决方案中,OceanBase作为一个由阿里巴巴集团自主研发的分布式数据库系统,以其独特的架构设计和卓越的性能表现脱颖而出。本文将深入探讨OceanBase与其他常见关系型数据库管理系统(如MySQL、Oracle)之间的关键差异,并通过具体的代码示例来展示这些差异。
188 1
|
3月前
|
关系型数据库 OLAP 分布式数据库
揭秘Polardb与OceanBase:从OLTP到OLAP,你的业务选对数据库了吗?热点技术对比,激发你的选择好奇心!
【8月更文挑战第22天】在数据库领域,阿里巴巴的Polardb与OceanBase各具特色。Polardb采用共享存储架构,分离计算与存储,适配高并发OLTP场景,如电商交易;OceanBase利用灵活的分布式架构,优化数据分布与处理,擅长OLAP分析及大规模数据管理。选择时需考量业务特性——Polardb适合事务密集型应用,而OceanBase则为数据分析提供强大支持。
630 2
|
3月前
|
存储 SQL 数据库
OceanBase数据库的分区策略
【8月更文挑战第13天】OceanBase数据库的分区策略
173 5
|
3月前
|
存储 SQL 算法
【OceanBase】惊天大反转!启动时真的会占用95%磁盘空间?别怕!揭秘真相+实用调整技巧,手把手教你如何优雅地管理磁盘空间,让你的数据库从此告别“吃土”模式!
【8月更文挑战第15天】OceanBase是一款高性能分布式数据库,启动时并不会默认占用95%磁盘空间,这是一种误解。其设计注重资源管理,可根据业务需求动态调整空间使用。通过设置`max_disk_usage`等参数、优化表设计、定期清理数据及启用压缩等功能,可有效控制磁盘占用,确保高效利用存储资源。
66 1

热门文章

最新文章