首页 新闻中心 如何搞定数据库“大脑”?RapidsDB动态查询优化器快速解决

如何搞定数据库“大脑”?RapidsDB动态查询优化器快速解决

发布时间:2023-09-21  |  阅读:

数据库查询优化器是数据库管理系统中的关键组件,其重要性和意义不可低估。在现代应用中,数据库查询通常涉及复杂的SQL语句,可能包含多个表的连接、过滤条件、排序和聚合等操作。查询优化器的主要任务是分析和优化这些查询,以提供高效的查询执行计划,从而实现最佳性能和资源利用。

查询优化器的性能优化和资源管理能力直接关系到应用的响应速度和资源利用效率,同时也保证了数据的一致性和正确性。一个优秀的查询优化器可以使得数据库系统更加高效、稳定和可靠,满足不断增长的数据处理需求。

基于代价的优化器

常见的数据库查询优化器分为基于规则的优化器(Rule-based Optimization, RBO)和基于代价的优化器(Cost-based Optimization, CBO)。

规则优化是一种基于事先定义的规则和启发式方法来优化查询计划的方式。优化器会按照一系列预定的规则对查询进行转换和重写,以得到一个较为优化的查询计划。这些规则可能涉及谓词下推、连接顺序调整、子查询展开等。

RBO由于其简单直观,有很好的可预测性,因此在早期被广泛应用于数据库的查询优化器中。但其在处理复杂查询和适应动态环境方面存在局限性,优化质量较低,因此在现代数据库系统中,大家更多地选择采用基于代价的优化器(CBO)等更先进的优化方法。

CBO是通过评估查询执行计划的成本,从而选择最优的查询执行方案。在基于代价的优化中,优化器会使用数据库的统计信息来估算执行查询计划的成本,并根据代价来选择最佳的查询计划。

由于CBO是一种自适应的优化方法,因此可以根据实际运行时的执行情况动态调整查询计划,以适应不断变化的数据和环境条件。这使得优化器能够灵活应对动态的数据库环境,对不同的查询计划进行代价估算,从而更准确地选择最优的执行方案。

优化器的架构包含三个重要组件:基数估计器、代价模型和计划搜索空间。对于用户传来的SQL,优化器首先为其枚举出不同的执行计划,形成一个搜索空间;然后将收集得到的统计信息(如表的行数、谓词的选择率等)作为输入,在代价模型(cost model)中为不同的执行计划计算出相应的代价。由此产生的最小代价的计划会被优化器选中,成为最终的执行计划,并在数据库执行器中运行。

图片1.png

但可以看出,CBO依赖于准确的数据库统计信息,如表的行数、索引的选择率等。如果统计信息不准确或过时,优化器可能会做出错误的优化决策,导致查询性能下降。

学习型优化器

RapidsDB动态查询优化器是一个学习型优化器,这意味着在执行查询时它会记录查询语句,观察查询结果,并根据最终查询时间更新迭代基数进行估计。

初始化优化器

在查询进入系统后会生成一个语法分析树来表示查询到关系代数表达式。之后,RapidsDB会首先基于数据独立性、一致性假设计算出初步的数据基数,再使用启发式算法找到代价最小的查询计划。

RapidsDB优化器内部的知识库可以记住查询的每个部分以及每个部分执行的成本。这个步骤是在查询执行时,在增量的基础上完成的。因此随着查询数量的增加,知识库记录的执行历史数据也会随之增加。这样就完成了优化器初始化和数据的积累。随着数据的增加,学习型优化器的优化结果准确性也会随之增加。

优化器的更新迭代

在静态优化过程中,由于算法模型固定,因此如果一个查询计划是低效的,那么在多次查询后,优化器仍会选择这个低效的查询计划。但是,如果使用动态优化,优化器则会根据历史查询结果自动更新查询计划,进而在多次查询后生成更高效的查询计划。学习型优化器能够利用历史查询结果来不断改进查询计划,从而解决这个问题。

在优化器中,找到关联语句的查询顺序是一个最重要也是最困难的能力。对于一个关联查询语句,其搜索空间的个数随着关联表个数的增加而呈指数级增加。

以关联查询为例,首先通过知识库中记忆的执行历史信息和训练模型,获取每张表中各字段的分布情况。在传入一个新的SQL查询语句后,RapidsDB将其转换为查询树,优化器将其向量化以表示表之间的关联关系及选择谓词,同时形成包含表和选择谓词对应基数的向量,最终将包含SQL查询语句和其对应基数的向量组合在一起。接下来,使用强化学习算法找到对于当前状态下的最佳行动,以尽可能增加奖励。由于查询语句的可能性非常多,不可能穷尽所有的状态,因此RapidsDB使用深度确定性策略梯度算法构建奖励数据表,使得优化器可以解决连续动作空间的策略。初始的奖励表由上节初始化的数据训练得出。

随着数据库的使用以及数据源的更新,优化器的知识库增加了新的查询结果,模型会根据用户的设置,在达到一定的时间或精度损失的情况下,使用新的数据对模型进行更新重训练。

以下是RapidsDB在处理多表关联查询时的流程示例:

图片2.png

自适应下推的联邦查询系统

由于RapidsDB联邦了来自不同数据源的数据,如果这些数据源可以提供有关数据和查询的统计信息,那么这些信息也会进入到RapidsDB的优化器,使用RapidsDB的优化器帮助不同的后端数据源进行优化,并决定查询发生的顺序及位置。最后通过连接器将需要进行下推的命令给到后端数据源进行查询。

RapidsDB动态查询优化器的优势

解决冷启动

对于数据驱动、基于学习的优化器来说,解决冷启动问题是一个重要的挑战。在数据库使用初期,由于缺乏历史数据,模型难以进行有效的优化。为了解决这个问题,RapidsDB采用了预估基数和启发式算法,从而实现了在没有历史数据的情况下也能够进行优化。

持续迭代,持续优化

随着数据库的使用,系统会产生大量的数据,这为模型的持续优化提供了条件。模型在使用中持续更新、训练,可以让数据库运行越来越高效。

更好的数据源利用率

基于高可扩展的数据联邦,联接20+不同数据源,RapidsDB的优化器可充分利用不同数据源提供的优化信息,而无需进行耗时的ETL过程。这种做法可以大大提高数据处理效率和精度。

热门新闻