发布时间:2023-04-27 | 阅读:
RapidsDB是一个高度可扩展的联邦查询引擎,使用了独特的自适应下推技术,同时RapidsDB动态查询优化器能够通过与联邦连接器合作的增量过程,以实现更好地利用系统资源并提高查询优化性能。目前,柏睿数据RapidsDB动态查询优化技术已获得美国专利。 本文将介绍RapidsDB动态查询优化技术的基本原理和实践。 查询优化是数据库系统中非常重要的一个技术应用,它旨在提高查询效率,减少资源消耗。一个优化过的查询可能会比一个未优化过的查询快10倍或100倍,同时使用更少的内存和CPU功率。因此,查询优化的总体思路就是要最大限度地利用数据库。
RapidsDB是一个高度可扩展的联邦查询引擎,不仅采用了条件下推和基于成本的优化等常见查询优化技术,还使用独特的自适应下推技术。RapidsDB自适应下推的优势在于能够联邦不同类型的数据源,无需ETL过程(数据提取、转换、加载),使用标准的SQL语言输入查询,并将部分查询自动调整以适应该系统的语法。
RapidsDB自适应下推技术通过将查询分割并将其下推到联邦数据库中的某一个或多个数据源中运行,从而减少网络传输的数据量,这个过程被称为“凝缩”。 如下图,左图是一个优化后的查询,右边即为“凝缩”。
RapidsDB可以通过下推来获取一个表,或者下推可用的条件,也可以下推关联或聚合操作;联邦连接器和查询引擎之间的合作过程决定了查询的哪些部分应该下推至后端数据库;同时自适应下推适应了产生数据的系统,因此可以用标准的SQL语言来输入查询,并将部分查询自动调整以适应该系统的语法。目前,RapidsDB系统已经联邦了20+广泛的数据源,包括关系型系统,原始数据系统等其他系统,而不只是SQL系统。
未来,由于RapidsDB基于分布式架构可高度扩展,还会有更多类型的数据可以联邦进来,这也将给查询优化提出独特的新挑战。
联邦内不同系统的数据访问方法和效率不同,能够提供优化帮助的能力也不尽相同,因此在进行联邦查询优化时,必须考虑不同系统之间的差异。 通常查询优化器使用这些有关数据的统计数据和元数据来优化查询;但对于RapidsDB这样的系统,能否获得可用的统计数据取决于哪些系统被联邦进来,以及查询的哪个部分将推送到这些系统,RapidsDB动态查询优化器会尝试学习统计信息以找出最好的执行方法。 以下是在RapidsDB中进行联邦查询的案例。RapidsDB联邦查询整合了来自多个系统的数据,使用统一的ANSI SQL查询语法,能够使多个联邦数据库看起来像一个单一的关系型数据库。可以说,RapidsDB联邦是一个典型的数据库管理系统。 这个查询从HDFS连接器中获取点击数据,并与Postgres和Oracle表关联,以分组计算点击次数。优化这种查询较为复杂,因为数据来自不同的系统,这些系统也可能缺乏优化信息,RapidsDB动态查询优化器就是为处理这种问题而设计的。 RapidsDB动态查询优化器是一个学习型的优化器,它有一个与联邦连接器合作的增量过程,以获得更好更有用的统计数据和查询,能够在查询执行期间动态优化查询计划,避免不必要的计算和磁盘访问操作,以便更好地利用系统资源并提高查询性能。 RapidsDB动态查询优化器是一个学习型优化器,这意味着在执行查询时它会学习查询,观察查询结果,并试图理解这些数据。 同时,它也是一个合作型优化器。因为它联邦了来自不同数据源的数据,如果这些数据源可以提供有关数据的信息,那么它们可以与优化器合作,将这些信息带入到优化过程中。这就意味着每个不同的后端可以帮助优化,并且提供只有此后端和连接器知道的信息。在有信息提供的前提下,连接器是否能够与优化器交互以将信息带入到优化进程中至关重要。 借助JVM的强大编译功能,RapidsDB动态查询优化器可以添加用户自定义的函数和类型,并将数据结构图转化成动态程序,将查询转换成JAVA字节码程序,以直接精准控制指令的生成并提高查询的运行效率。 当JVM在运行字节码程序的时候,还会根据程序运行时的情况做运行时优化,包括指令和数据的预取等,以此进一步提高查询的执行效率。要指出的是,数据库查询程序尤其适合运行时优化,因为有大量的循环嵌套等。 当查询进入系统并被分析时,在分解查询和创建查询图的过程中,RapidsDB会观察查询的各个分片并对它们进行建模,以生成优化策略。 RapidsDB有一个知识库,可以记住查询的每个部分,以及在查询被执行时各个部分的行为,不同的分片复杂程度也会各不相同。优化器有一种方法可以把它们相互联系起来,试图发现基数或者其它有用的优化信息。并且它是在查询执行时,在增量的基础上完成这项工作的。同样的,如果连接器具有有效的优化信息,它可以在优化过程中提供这些信息。连接器和优化过程是深入交织在一起的。 但是如果没有这样的信息,或者信息的置信度或者分辨率很低,那么模型就会被建立在RapidsDB优化器中,用于了解查询其中的数据。此时的优化器与连接器之间以假设的方式交互。这意味着在对查询进行优化时,优化器会为与不同联邦数据源相对应的连接器提供有关查询的假设,这些假设可以看做是基于优化器中之前所做的查询和学习而提出的建议。它也可以是默认的假设,或是在优化器中从一开始就建立起来的启发式假设,这些假设基本上是向连接器提出的,连接器可以选择加强或反驳这些假设,或是与它们进行交互,某个连接器可以查看某个提议,并决定对一些数据进行采样。 如果某个数据库有可用的统计数据,它可以根据可用的统计数据来验证或反驳假设。连接器能够决定是否值得花成本来获取统计数据,以验证优化器所给定的假设。 所以说,优化器和连接器之间有非常多的互动过程,通过这些合作的增量过程,来获得更好更有用的统计数据。其中连接器可以提供动态置信水平的信息,以帮助建模查询并做出成本决策。同时,这个过程也用于查询工具添加决策,即根据查询的置信度决定是否添加工具以获取更多信息。整个过程伴随着查询的运行,并根据所得的信息建立一个知识库,以为后续查询优化过程提供信息。 下图展示了RapidsDB动态查询优化器执行简单查询的完整过程,可以看到学习型优化器是如何与连接器合作、建立知识库来有效地优化查询的增量过程。 可以看到,图的左边有很多数据源,不同数据源提供不同程度可用的优化信息。 在数据源顶部,可以看到数据库有一个完整的数据库模式和统计数据,这些统计数据可能是关于表的直方图或者基数信息。连接器可以直接把这些信息提供给查询优化器,只要这些统计数据可用,数据源就能够直接把它们提供至优化过程。 在数据源的底部是原始数据源的连接器