yuan-er

导航

 

支持LLVM

可获得性

本特性自V300R002C00版本开始引入。

特性简介

GaussDB的LLVM(Low Level Virtual Machine)技术,通过将运行时表达式的执行函数编译成IR(Intermediate Representation,原始代码在不同平台上所对应的机器指令的内存形态中间语言表示)后,基于编译产生的IR提供了查询动态编译(Code Generation,以下简称Codegen)执行的能力。

客户价值

通过对查询动态编译执行,大幅提高重查询性能。

特性描述

GaussDB借助LLVM提供的库函数,依据查询执行计划树,将在执行器阶段才会确定查询实际执行路径的过程提前到执行初始化阶段,从而规避查询执行时候伴随的函数调用、逻辑条件分支判断以及大量的数据读取等问题,以达到提升查询性能的目的。

特性增强

505.1.0版本增强:
  • LLVM动态编译表达式IR采用异步编译的方式进行,将编译开销隐藏,使得编译过程不影响SQL执行的流程。
  • 采用LLVM动态编译执行的SQL,可将编译产物IR绑定至GPlan进行缓存,节省后续以相同方式执行同一SQL的开销。
  • 可通过配置codegen_compile_thread_num参数来增加Codegen编译线程的数量,使用多线程编译方式可以提高在大并发重表达式查询场景下的吞吐能力。
  • 可通过配置llvm_max_memory参数来控制Codegen执行方式下,当前系统中可产生的最大IR内存占用量,以避免LLVM编译占用过多内存资源,从而影响系统性能和其他功能。
  • 可通过查看系统视图PV_TOTAL_MEMORY_DETAIL中的memorytype列的llvm_used_memory行观测到当前系统中由Codegen生成且查询未释放的表达式IR所占用内存。

特性约束

  • 编译缓存仅支持GPlan场景,不支持其他Plan缓存场景。
  • 增加Codegen编译线程的数量,会消耗更多系统资源,加重系统负载,在资源有限的情况下,提升系统整体吞吐能力的同时可能导致单个SQL的执行性能下降。
  • Codegen多线程异步编译情况下,多个编译线程之间不存在“工作量窃取(work-stealing)”机制,因此不保证编译任务在多个线程之间负载均衡。
  • 内存系统视图中的llvm_used_memory项与实际LLVM编译产生的IR内存使用量仅具有数量级相似性,不是精确计算。
  • llvm_max_memory参数仅限制Codegen执行方式下,编译产生的IR内存使用上限。当到达该上限触发执行降级后,调小llvm_max_memory的值无法立即释放多余IR所占用的内存,实际IR所占用的内存随着对应的SQL执行完毕后释放。

依赖关系

依赖于LLVM开源组件,当前使用的开源版本为12.0.1。

 
posted on 2025-01-16 09:27  数据库笔记  阅读(7)  评论(0)    收藏  举报