写点什么

openGauss 都做了哪些算子优化工作?

作者:daydayup
  • 2023-07-22
    北京
  • 本文字数:1263 字

    阅读完需:约 4 分钟

openGauss 都做了哪些算子优化工作?

openGauss 2023-04-12 17:58


openGauss 在代码里面实现了大量的算子级优化工作,为了更进一步便于用户理解,我们对这些工作进行了总结,并且对内部具体的一些算法进行详细介绍,其总结如下。


【索引扫描算子优化】


对索引扫描算子进行了一定程度的重构与优化,以提升算子性能。优化主要包括以下几个方面:


  1. 识别到程序中存在影响性能的噪点,对其进行屏蔽;

  2. 在现有执行流程下,为多数场景下的高频操作建立 fast-path,以提高执行效率;

  3. 对一些数据结构与算法的实现进行了优化重构,以提升性能。最终经过测试,IndexScan 算子性能提升 10%,IndexOnlyScan 算子性能提升 30%。


【函数依赖】


函数依赖,是多列统计信息的一种,可以描述属性之间的关联关系,其主要用途是提高选择率估算的准确性。在引用函数依赖特性之前,数据库会使用条件独立假设的方法来估算选择率。举一个生活中的例子,在一个班级中,男女生的比例是 1:1,喜欢瑜伽的人数占比为 20%,身高 175cm 以下的人数占比为 50%。我们可以说喜欢瑜伽且身高在 175cm 以下的女生的占比为 50% * 20% * 50% = 5%吗?显然这个计算结果会比实际结果略低,因为这几个属性之间有关联关系,喜欢瑜伽的人中女生占多数,女生的身高较男生普遍偏低。函数依赖特性就是用于解决此类问题,在典型场景下对于高频数据的查询,选择率提升 20%;对于中频数据的查询,选择率提升 10 倍;对于典型场景,选择率提升 70 倍。


【AGG 函数共享转移状态】


AGG 函数的执行分为 3 个阶段:初始化转移状态、执行 transition 函数、执行 final 函数。AGG 函数共享转移状态特性目的在于调整转移状态和 transition 函数,实现资源共享。例如执行"SELECT avg(a), sum(a) FROM t;",此时的转移状态初始化后为两个参数(total, count),然后遍历表的所有元组,total 执行累加操作,count 执行自增操作,最后把 total/count 和 total 分别作为 avg 函数和 sum 函数的返回结果。经验证,SQL 语句"SELECT avg(a), sum(a) FROM t;"的总耗时缩短 48%左右。对其他可以共享转移状态的 AGG 函数,也可以实现不同程度的性能提升。


【Parser 优化】


优化 Parser 阶段中关键字检查模块,将关键字查找算法由原来的二分查找算法优化为哈希查找算法,同时优化关键字内存数据结构,cache 访问更友好,优化后 Parser 阶段的性能提升 10%。


【新型选择率模型】


新型选择率模型充分利用基于直方图的统计信息,平衡计算量与准确性,充分考虑数据分布情况,通过轻量的计算,提高对低频值的估算准确率,能够使得优化器生成更优的执行计划,进而提高查询效率。


【通信优化】


提升通信整体性能,调整通信逻辑,默认使用非阻塞通信方式,当需要阻塞通信语义时,利用 latch 轻量锁机制,降低通信阶段耗时。轻量通信方式的开启与否通过 POSTMASTER 级别的 GUC 参数 light_comm 控制,当 light_comm 的值为 ON / TRUE 时,将开启轻量通信。


【表达式展平化】


基于非递归、操作码方式实现数据库中表达式计算,致力于通过展平化表达式信息减少计算过程中堆栈使用、函数调用等开销,提升语句的执行性能。


后续,openGauss 还会持续对基础算子进行优化,不断完善 openGauss 社区竞争力。

用户头像

daydayup

关注

还未添加个人签名 2023-07-18 加入

还未添加个人简介

评论

发布
暂无评论
openGauss都做了哪些算子优化工作?_opengauss_daydayup_InfoQ写作社区