[ https://issues.apache.org/jira/browse/IMPALA-7655?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16659154#comment-16659154 ]
Tim Armstrong commented on IMPALA-7655: --------------------------------------- [~philip] actually it's more confusing than that. The majority of LLVM optimisations *are* enabled in debug builds, specifically optimisations that transform LLVM IR into LLVM IR. The optimisations that are disabled are those that happen during the LLVM codegen phase, which transforms LLVM IR into assembly. I'm not sure if this is actually what was intended originally but it's the state of things. One additional bit of context is that all of the scalar function infrastructure impala_functions.py, ScalarFnCall, etc, is based around eagerly evaluating the arguments to the function, then calling the function. So for functions or expressions like NULLVALUE() or "IS NOT DISTINCT FROM" where input expressions are always evaluated, there's no special handling required in the backend and our existing constant folding infrastructure in the frontend will work as expected when all arguments are constant. The problematic functions are the ones where input expressions are conditionally evaluated, e.g. if(a, b, c), where c should not be evaluated if a is false, and also where we can simplify the expression if a is constant, regardless of whether b or c is constant. > Codegen output for conditional functions (if,isnull, coalesce) is very > suboptimal > --------------------------------------------------------------------------------- > > Key: IMPALA-7655 > URL: https://issues.apache.org/jira/browse/IMPALA-7655 > Project: IMPALA > Issue Type: Improvement > Components: Backend > Reporter: Tim Armstrong > Priority: Major > Labels: codegen, perf, performance > > https://gerrit.cloudera.org/#/c/11565/ provided a clue that an aggregation > involving an if() function was very slow, 10x slower than the equivalent > version using a case: > {noformat} > [localhost:21000] default> set num_nodes=1; set mt_dop=1; select count(case > when l_orderkey is NULL then 1 else NULL end) from > tpch10_parquet.lineitem;summary; > NUM_NODES set to 1 > MT_DOP set to 1 > Query: select count(case when l_orderkey is NULL then 1 else NULL end) from > tpch10_parquet.lineitem > Query submitted at: 2018-10-04 11:17:31 (Coordinator: > http://tarmstrong-box:25000) > Query progress can be monitored at: > http://tarmstrong-box:25000/query_plan?query_id=274b2a6f35cefe31:95a1964200000000 > +----------------------------------------------------------+ > | count(case when l_orderkey is null then 1 else null end) | > +----------------------------------------------------------+ > | 0 | > +----------------------------------------------------------+ > Fetched 1 row(s) in 0.51s > +--------------+--------+----------+----------+--------+------------+----------+---------------+-------------------------+ > | Operator | #Hosts | Avg Time | Max Time | #Rows | Est. #Rows | Peak > Mem | Est. Peak Mem | Detail | > +--------------+--------+----------+----------+--------+------------+----------+---------------+-------------------------+ > | 01:AGGREGATE | 1 | 44.03ms | 44.03ms | 1 | 1 | 25.00 > KB | 10.00 MB | FINALIZE | > | 00:SCAN HDFS | 1 | 411.57ms | 411.57ms | 59.99M | -1 | 16.61 > MB | 88.00 MB | tpch10_parquet.lineitem | > +--------------+--------+----------+----------+--------+------------+----------+---------------+-------------------------+ > [localhost:21000] default> set num_nodes=1; set mt_dop=1; select > count(if(l_orderkey is NULL, 1, NULL)) from tpch10_parquet.lineitem;summary; > NUM_NODES set to 1 > MT_DOP set to 1 > Query: select count(if(l_orderkey is NULL, 1, NULL)) from > tpch10_parquet.lineitem > Query submitted at: 2018-10-04 11:23:07 (Coordinator: > http://tarmstrong-box:25000) > Query progress can be monitored at: > http://tarmstrong-box:25000/query_plan?query_id=8e46ab1b84c4dbff:2786ca2600000000 > +----------------------------------------+ > | count(if(l_orderkey is null, 1, null)) | > +----------------------------------------+ > | 0 | > +----------------------------------------+ > Fetched 1 row(s) in 1.01s > +--------------+--------+----------+----------+--------+------------+----------+---------------+-------------------------+ > | Operator | #Hosts | Avg Time | Max Time | #Rows | Est. #Rows | Peak > Mem | Est. Peak Mem | Detail | > +--------------+--------+----------+----------+--------+------------+----------+---------------+-------------------------+ > | 01:AGGREGATE | 1 | 422.07ms | 422.07ms | 1 | 1 | 25.00 > KB | 10.00 MB | FINALIZE | > | 00:SCAN HDFS | 1 | 511.13ms | 511.13ms | 59.99M | -1 | 16.61 > MB | 88.00 MB | tpch10_parquet.lineitem | > +--------------+--------+----------+----------+--------+------------+----------+---------------+-------------------------+ > {noformat} > It turns out that this is because we don't have good codegen support for > ConditionalFunction, and just fall back to emitting a call to the interpreted > path: > https://github.com/apache/impala/blob/master/be/src/exprs/conditional-functions.cc#L28 > See CaseExpr for an example of much better codegen support: > https://github.com/apache/impala/blob/master/be/src/exprs/case-expr.cc#L178 -- This message was sent by Atlassian JIRA (v7.6.3#76005) --------------------------------------------------------------------- To unsubscribe, e-mail: issues-all-unsubscr...@impala.apache.org For additional commands, e-mail: issues-all-h...@impala.apache.org