高斯数据库 (gaussDB) - 性能调优 (9)

配置 LLVM

LLVM(Low Level Virtual Machine) 动态编译技术可以为每个查询生成定制化的机器码用
于替换原本的通用函数。通过减少实际查询时冗余的条件逻辑判断、虚函数调用并提
高数据局域性,从而达到提升查询整体性能的目的。
由于 LLVM 需要消耗额外的时间预生成 IR 中间态表示并编译成机器码,因此在小数据量
场景或查询本身耗时较少时,可能引起性能的劣化。

LLVM 适用场景与限制

适用场景

  • 支持 LLVM 的表达式
    查询语句中存在以下的表达式支持 LLVM 优化:
    a. Case…when… 表达式
    b. In 表达式
    c. Bool 表达式 (And/Or/Not)
    d. BooleanTest 表达式 (IS_NOT_KNOWN/IS_UNKNOWN/IS_TRUE/
    IS_NOT_TRUE/IS_FALSE/IS_NOT_FALSE)
    e. NullTest 表达式 (IS_NOT_NULL/IS_NULL)
    f. Operator 表达式
    g. Function 表达式 (lpad, substring, btrim, rtrim, length)
    h. Nullif 表达式
    表达式计算支持的数据类型包括 bool, tinyint, smallint, int, bigint, float4, float8,
    numeric, date, time, timetz, timestamp, timestamptz, interval, bpchar, varchar, text, oid。
    仅当表达式出现在向量化执行引擎中 Scan 节点的 filter、Hash Join 节点中的
    complicate hash condition、hash join filter、hash join target, Nested Loop 节点中的
    filter、join filter, Merge Join 节点的 merge join filter, merge join target, Group 节点中的
    filter 表达式时,才会考虑是否使用 LLVM 动态编译优化。
  • 支持 LLVM 的算子:
    a. Join :HashJoin
    b. Agg :HashAgg
    c. Sort
    其中 HashJoin 算子仅支持 Hash Inner Join,对应的 hash cond 仅支持 int4、bigint、
    bpchar 类型的比较;HashAgg 算子仅支持针对 bigint、numeric 类型的 sum 及 avg 操
    作,且 group by 语句仅支持 int4、bigint、bpchar,text,varchar,timestamp 类型操
    作,同时支持 count(*) 聚集操作。Sort 算子仅支持对 int4,bigint,numeric,
    bpchar,text,varchar 数据类型的比较操作。除此之外,无法使用 LLVM 动态编译
    优化,具体可通过 explain performance 工具进行显示。

非适用场景

  • 不支持 CN 上 LLVM 动态编译优化。
  • 不支持小数据量表使用 LLVM 动态编译优化。
  • 不支持生成非向量化执行路径的查询作业

其他因素对 LLVM 性能的影响

LLVM 优化效果不仅依赖于数据库内部具体的实现,还与当前所选择的硬件环境等有
关。

  • 表达式调用 C- 函数个数
    数据库内部针对表达式计算并未实现全 codegen,即在整个表达式计算中部分表达
    式实现了 codegen,部分直接调用原本的 C 代码。如果整个表达式计算中后者占据
    了主要部分,使用 LLVM 动态编译优化,可能会导致性能劣化。通过设置
    log_min_message 的级别为 DEBUG1 可以查看到哪些表达式直接调用了 C 代码实
    现。
  • 内存资源
    LLVM 特性的一个重要思想是保障数据的局域特性,即数据应尽可能的存放在寄存
    器中。同时应减少数据加载,因此在使用 LLVM 优化时应设置足够大的
    work_mem,保证对应使用 LLVM 优化的执行代码整个过程在内存中实现,否则可
    能引起性能劣化。
  • 优化器代价估算
    LLVM 特性实现了简易的代价估算模型,即依据当前参与节点运算的表大小决定当
    前节点是否考虑使用 LLVM 动态编译优化。如果优化器低估了实际参与运算的行
    数,则原本可获得收益的未正常获得收益。反之亦然。

LLVM 使用建议

目前 LLVM 在数据库内核侧已默认打开,用户可结合上述的分析进行配置,总体建议如
下:
1. 设置合理的 work_mem,在允许的条件下尽可能设置较大的 work_mem,如果出现
大量下盘,则建议关闭 LLVM 动态编译优化 (通过设置 enable_codegen=off 实现)。
2. 设置合理的 codegen_cost_threshold(默认值为 10000),确保小数据量场景下避免使
用 LLVM 动态编译优化。当 codegen_cost_threshold 的值设定后,因使用 LLVM 动态
编译优化引入性能劣化,则建议增加 codegen_cost_threshold 的取值。
3. 对于表达式计算使用 LLVM 动态编译优化,如果存在大量的调用 C- 函数的场景,建
议关闭 LLVM 动态编译优化。
说明
在资源许可的情况下,数据量越大,可获得的性能提升效果越好。

  
    展开阅读全文