LLVM适用场景与限制
适用场景
支持LLVM的表达式
查询语句中存在以下的表达式支持LLVM优化:
- Case…when… 表达式
- In表达式
- Bool表达式(And/Or/Not)
- BooleanTest表达式(IS_NOT_KNOWN/IS_UNKNOWN/IS_TRUE/IS_NOT_TRUE/IS_FALSE/IS_NOT_FALSE)
- NullTest表达式(IS_NOT_NULL/IS_NULL)
- Operator表达式
- Function表达式
- 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的算子:
- Join:HashJoin
- Agg:HashAgg
- 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工具进行显示。
非适用场景
- 不支持小数据量表使用LLVM动态编译优化。
- 不支持生成非向量化执行路径的查询作业。