GaussDB关键技术原理:高性能(五)

GaussDB关键技术原理:高性能(四)从USTORE存储引擎、计划缓存计划技术、数据分区与分区剪枝、列式存储和向量化引擎、SMP并行执行等五方面对高性能关键技术进行解读,本篇将从LLVM动态查询编译执行、SQL-BYPASS执行优化、线程池化、多核处理器优化、日志无锁刷新与多级流水等方面继续介绍GaussDB高性能关键技术,并对高斯数据库性能优化进行总结。

3.11 LLVM动态查询编译执行

在传统经典执行器算子中基于遍历树的表达式计算框架,这种框架的好处是清晰明了,但是在性能上却不是最优的,主要有以下几个原因:

(1)表达式计算其框架的通用性决定了其执行模式要适配各种不同的操作符和数据类型,因此在运行时要根据其表达式遍历的具体结果来确定其执行的函数和类型,对这些类型的判断要引入非常多的分支判断。

(2)表达式计算在整体的执行过程中要进行多次的函数调用,其调用的深度取决于其树的深度,这一部分也有着非常大的开销。

这两个核心原因,分支判断和函数调用同样在执行算子中也是影响性能的关键因素,为了提升其执行速度,GaussDB引入了业界著名的开源编译框架LLVM(Low Level Virtual Machine)来提速的执行速度,LLVM是一个通用的编译框架,能够支持不同的计算平台。LLVM提升整体表达式计算的核心要点如下:

(1)GaussDB内置的LLVM编译框架通过为每一个计算单元(表达式或者执行算子里面的热点函数)生成一段独特的执行代码,由于在编译的时候提前知道了表达式涉及的操作和数据类型,为这个表达式生成的执行代码将所有的逻辑内联,完全去除函数调用。GaussDB内置的LLVM编译为这个表达式生成了一段特殊代码。里面已经没有任何其他的函数调用,所有的函数都已经被内联在一起,同时去掉了关于数据类型的分支判断。

(2)LLVM编译框架利用编译技术最大程度的让生成的代码将中间结果的数据存储在CPU寄存器里,让数据读取的速度加快。

LLVM通过消除条件逻辑冗余,降低虚函数调用次数,改善数据locality,可大大降低任务执行代价; LLVM生成的machine code为一次性成本,整个执行过程均可使用,数据量越大,所获取的收益将越大,因此对于一个可以实施LLVM动态编译优化的查询,其收益随着数据量的增多会逐步增加,对应的性能提升比例也会越来越大

3.12 SQL-BYPASS执行优化

在典型的OLTP场景中,简单查询占了很大一部分比例。这类查询本身大多数会走索引、分区剪支、只涉及单表和简单表达式的查询,这类查询的有效数据读取占比在这个查询解析、执行过程中并不大,即便使用计划缓存技术(PBE)把查询解析部分省下来以后,执行器初始化exec_init_*()仍然会有比较明显的开销,例如下面火焰图所profiling的场景,执行器初始化开销占比超过40%,并且每个同样的模板查询这部分的操作都是无效的重复开销,有效部分只有Operator::get_next(),占比只有15%左右。

因此为了加速这类查询,提出了SQL-BY-PASS框架,其核心思想是对执

评论 20
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Gauss松鼠会

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值