LLVM Application Scenarios and Restrictions
Application Scenarios
Expressions supporting LLVM
The query statements that contain the following expressions support LLVM optimization:
- 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
Supported data types for expression computing are bool, tinyint, smallint, int, bigint, float4, float8, numeric, date, time, timetz, timestamp, timestamptz, interval, bpchar, varchar, text, and oid.
Consider using LLVM only if expressions are used in the following content in a vectorized executor: filter in the Scan node; complicate hash condition, hash join filter, and hash join target in the Hash Join node; filter and join filter in the Nested Loop node; merge join filter and merge join target in the Merge Join node; and filter in the Group node.
Operators supporting LLVM
- Join: HashJoin
- Agg: HashAgg
- Sort
Where HashJoin supports only Hash Inner Join, and the corresponding hash cond supports comparisons between int4, bigint, and bpchar. HashAgg supports sum and avg operations of bigint and numeric data types. Group By statements supports int4, bigint, bpchar, text, varchar, timestamp, and count(*) aggregation operation. Sort supports only comparisons between int4, bigint, numeric, bpchar, text, and varchar data types. Except the preceding operations, LLVM cannot be used. You can use the explain performance tool to check whether LLVM can be used.
Non-applicable Scenarios
- Tables that have small amount of data cannot be dynamically compiled.
- Query jobs with a non-vectorized execution path cannot be generated.