论文部分内容阅读
在飞速发展的信息时代,对于各类信息的存储、查询需求越来越大,尤其是当现实社会的各类信息都被转化成电子信息存放和表示时。对于数据的存储、加工、查询的需求越来越高。数据库是数据处理的中坚力量,如何提高查询性能是数据库设计与实现的重要议题。数据库拥有复杂的类型体系和解释执行的计算方式,带来许多冗余计算,这导致其执行效率较低,无法充分利用硬件特性;而传统编译器又只能在执行前生成代码,无法消除数据库带来的不确定性。如果在执行时使用数据库的动态信息和用户查询请求中的信息,去掉不需要的冗余指令,优化代码逻辑,将进一步提高执行效率。本文讨论了在分布式列式内存数据库中,使用即时编译器作为工具,根据数据库中的算子逻辑和动态执行信息,生成更优执行代码的技术。本文没有采用将整个查询分析树转化成执行函数的做法,因为在分布式环境下,列式存储的引擎将打破这样转化带来的优势,而只在单个算子内部进行代码生成。本文采用Impala数据引擎封装的即时编译库作为底层支撑组件,在分布式内存数据库Goldfish中,实现了排序、分组两个算子和表达式计算部分的编译执行,并提出了基于元组数目进行自适应代码生成的方法。文章详细介绍了数据库中的排序、分组、聚合等算子如何在运行时,动态修改执行逻辑,以期获得更好的执行效率,并对使用代码生成技术的算子进行单元测试。根据测试结果,在一定范围内,代码生成技术在元组数目越大时效果越明显。排序和分组算子都在元组数目较大时获得了几倍的性能提升,聚合算子中的表达式计算模块也获得了一定的性能提升。使用相关工具测试之后发现,使用代码生成技术的新算子,其指令数低于未进行代码生成的算子,其内存占用峰值也较低,因此无论是从时间效率还是空间效率来看,代码生成技术都能够提高查询性能。当元组数目较小时,由于代码生成本身会有开销,反而会降低程序性能。因此实际运行过程中,需要根据输入元组的数目确定是否使用代码生成技术。