Yifei Yang created CALCITE-4981: ----------------------------------- Summary: tpch q21 query plan has many cartesian joins after decorrelation Key: CALCITE-4981 URL: https://issues.apache.org/jira/browse/CALCITE-4981 Project: Calcite Issue Type: Bug Components: core Affects Versions: 1.27.0 Reporter: Yifei Yang
Hi, I found the query plan of tpch q21 has 6 cartesian joins (totally 18 joins) after calling the decorrelator. It's first reported [there|https://issues.apache.org/jira/browse/CALCITE-320], but it seems still an issue in 1.27.0. Thank you! query (tpch q21): {quote}{{select}} {{ s.s_name,}} {{ count(*) as numwait}} {{from}} {{ supplier s,}} {{ lineitem l1,}} {{ orders o,}} {{ nation n}} {{where}} {{ s.s_suppkey = l1.l_suppkey}} {{ and o.o_orderkey = l1.l_orderkey}} {{ and o.o_orderstatus = 'F'}} {{ and l1.l_receiptdate > l1.l_commitdate}} {{ and exists (}} {{ select}} {{ *}} {{ from}} {{ lineitem l2}} {{ where}} {{ l2.l_orderkey = l1.l_orderkey}} {{ and l2.l_suppkey <> l1.l_suppkey}} {{ )}} {{ and not exists (}} {{ select}} {{ *}} {{ from}} {{ lineitem l3}} {{ where}} {{ l3.l_orderkey = l1.l_orderkey}} {{ and l3.l_suppkey <> l1.l_suppkey}} {{ and l3.l_receiptdate > l3.l_commitdate}} {{ )}} {{ and s.s_nationkey = n.n_nationkey}} {{ and n.n_name = 'BRAZIL'}} {{group by}} {{ s.s_name}} {{order by}} {{ numwait desc,}} {{ s.s_name}} {{limit 100}}{quote} Plan generated: {quote}{{EnumerableProject(S_NAME=[$0], NUMWAIT=[$1])}} {{ EnumerableLimitSort(sort0=[$1], sort1=[$0], dir0=[DESC], dir1=[ASC], fetch=[100])}} {{ EnumerableAggregate(group=[\{0}], NUMWAIT=[COUNT()])}} {{ EnumerableProject(s_name=[$3])}} {{ EnumerableFilter(condition=[IS NULL($39)])}} {{ EnumerableHashJoin(condition=[AND(=($11, $37), =($15, $38))], joinType=[left])}} {{ EnumerableProject(s_comment=[$0], s_phone=[$1], s_nationkey=[$2], s_name=[$3], s_address=[$4], s_acctbal=[$5], s_suppkey=[$6], l_returnflag=[$7], l_receiptdate=[$8], l_tax=[$9], l_shipmode=[$10], l_suppkey=[$11], l_shipdate=[$12], l_commitdate=[$13], l_partkey=[$14], l_orderkey=[$15], l_quantity=[$16], l_linestatus=[$17], l_comment=[$18], l_extendedprice=[$19], l_linenumber=[$20], l_discount=[$21], l_shipinstruct=[$22], o_orderstatus=[$23], o_clerk=[$24], o_orderdate=[$25], o_shippriority=[$26], o_custkey=[$27], o_totalprice=[$28], o_orderkey=[$29], o_comment=[$30], o_orderpriority=[$31], n_comment=[$32], n_nationkey=[$33], n_regionkey=[$34], n_name=[$35], $f0=[CAST($38):BOOLEAN])}} {{ EnumerableHashJoin(condition=[AND(=($11, $36), =($15, $37))], joinType=[inner])}} {{ EnumerableProject(s_comment=[$0], s_phone=[$1], s_nationkey=[$2], s_name=[$3], s_address=[$4], s_acctbal=[$5], s_suppkey=[$6], l_returnflag=[$7], l_receiptdate=[$8], l_tax=[$9], l_shipmode=[$10], l_suppkey=[$11], l_shipdate=[$12], l_commitdate=[$13], l_partkey=[$14], l_orderkey=[$15], l_quantity=[$16], l_linestatus=[$17], l_comment=[$18], l_extendedprice=[$19], l_linenumber=[$20], l_discount=[$21], l_shipinstruct=[$22], o_orderstatus=[$27], o_clerk=[$28], o_orderdate=[$29], o_shippriority=[$30], o_custkey=[$31], o_totalprice=[$32], o_orderkey=[$33], o_comment=[$34], o_orderpriority=[$35], n_comment=[$23], n_nationkey=[$24], n_regionkey=[$25], n_name=[$26])}} {{ EnumerableHashJoin(condition=[=($15, $33)], joinType=[inner])}} {{ EnumerableProject(s_comment=[$0], s_phone=[$1], s_nationkey=[$2], s_name=[$3], s_address=[$4], s_acctbal=[$5], s_suppkey=[$6], l_returnflag=[$11], l_receiptdate=[$12], l_tax=[$13], l_shipmode=[$14], l_suppkey=[$15], l_shipdate=[$16], l_commitdate=[$17], l_partkey=[$18], l_orderkey=[$19], l_quantity=[$20], l_linestatus=[$21], l_comment=[$22], l_extendedprice=[$23], l_linenumber=[$24], l_discount=[$25], l_shipinstruct=[$26], n_comment=[$7], n_nationkey=[$8], n_regionkey=[$9], n_name=[$10])}} {{ EnumerableHashJoin(condition=[=($6, $15)], joinType=[inner])}} {{ EnumerableHashJoin(condition=[=($2, $8)], joinType=[inner])}} {{ EnumerableTableScan(table=[[tpch-sf0.01/csv, supplier]])}} {{ EnumerableFilter(condition=[=($3, 'BRAZIL')])}} {{ EnumerableTableScan(table=[[tpch-sf0.01/csv, nation]])}} {{ EnumerableFilter(condition=[>($1, $6)])}} {{ EnumerableTableScan(table=[[tpch-sf0.01/csv, lineitem]])}} {{ EnumerableFilter(condition=[=($0, 'F')])}} {{ EnumerableTableScan(table=[[tpch-sf0.01/csv, orders]])}} {{ EnumerableAggregate(group=[\{0, 1}], agg#0=[MIN($2)])}} {{ EnumerableProject(l_suppkey0=[$16], l_orderkey0=[$17], $f0=[true])}} {{ EnumerableFilter(condition=[<>($4, $16)])}} {{ EnumerableHashJoin(condition=[=($8, $17)], joinType=[inner])}} {{ EnumerableTableScan(table=[[tpch-sf0.01/csv, lineitem]])}} {{ EnumerableAggregate(group=[\{0, 1}])}} {{ EnumerableProject(l_suppkey=[$11], l_orderkey=[$15])}} {{ EnumerableNestedLoopJoin(condition=[true], joinType=[inner])}} {{ EnumerableNestedLoopJoin(condition=[true], joinType=[inner])}} {{ EnumerableNestedLoopJoin(condition=[true], joinType=[inner])}} {{ EnumerableTableScan(table=[[tpch-sf0.01/csv, supplier]])}} {{ EnumerableTableScan(table=[[tpch-sf0.01/csv, lineitem]])}} {{ EnumerableTableScan(table=[[tpch-sf0.01/csv, orders]])}} {{ EnumerableTableScan(table=[[tpch-sf0.01/csv, nation]])}} {{ EnumerableAggregate(group=[\{0, 1}], agg#0=[MIN($2)])}} {{ EnumerableProject(l_suppkey0=[$16], l_orderkey0=[$17], $f0=[true])}} {{ EnumerableFilter(condition=[<>($4, $16)])}} {{ EnumerableHashJoin(condition=[=($8, $17)], joinType=[inner])}} {{ EnumerableFilter(condition=[>($1, $6)])}} {{ EnumerableTableScan(table=[[tpch-sf0.01/csv, lineitem]])}} {{ EnumerableAggregate(group=[\{0, 1}])}} {{ EnumerableProject(l_suppkey=[$11], l_orderkey=[$15])}} {{ EnumerableHashJoin(condition=[AND(=($11, $36), =($15, $37))], joinType=[semi])}} {{ EnumerableProject(s_comment=[$0], s_phone=[$1], s_nationkey=[$2], s_name=[$3], s_address=[$4], s_acctbal=[$5], s_suppkey=[$6], l_returnflag=[$7], l_receiptdate=[$8], l_tax=[$9], l_shipmode=[$10], l_suppkey=[$11], l_shipdate=[$12], l_commitdate=[$13], l_partkey=[$14], l_orderkey=[$15], l_quantity=[$16], l_linestatus=[$17], l_comment=[$18], l_extendedprice=[$19], l_linenumber=[$20], l_discount=[$21], l_shipinstruct=[$22], o_orderstatus=[$27], o_clerk=[$28], o_orderdate=[$29], o_shippriority=[$30], o_custkey=[$31], o_totalprice=[$32], o_orderkey=[$33], o_comment=[$34], o_orderpriority=[$35], n_comment=[$23], n_nationkey=[$24], n_regionkey=[$25], n_name=[$26])}} {{ EnumerableHashJoin(condition=[=($15, $33)], joinType=[inner])}} {{ EnumerableProject(s_comment=[$0], s_phone=[$1], s_nationkey=[$2], s_name=[$3], s_address=[$4], s_acctbal=[$5], s_suppkey=[$6], l_returnflag=[$11], l_receiptdate=[$12], l_tax=[$13], l_shipmode=[$14], l_suppkey=[$15], l_shipdate=[$16], l_commitdate=[$17], l_partkey=[$18], l_orderkey=[$19], l_quantity=[$20], l_linestatus=[$21], l_comment=[$22], l_extendedprice=[$23], l_linenumber=[$24], l_discount=[$25], l_shipinstruct=[$26], n_comment=[$7], n_nationkey=[$8], n_regionkey=[$9], n_name=[$10])}} {{ EnumerableHashJoin(condition=[=($6, $15)], joinType=[inner])}} {{ EnumerableHashJoin(condition=[=($2, $8)], joinType=[inner])}} {{ EnumerableTableScan(table=[[tpch-sf0.01/csv, supplier]])}} {{ EnumerableFilter(condition=[=($3, 'BRAZIL')])}} {{ EnumerableTableScan(table=[[tpch-sf0.01/csv, nation]])}} {{ EnumerableFilter(condition=[>($1, $6)])}} {{ EnumerableTableScan(table=[[tpch-sf0.01/csv, lineitem]])}} {{ EnumerableFilter(condition=[=($0, 'F')])}} {{ EnumerableTableScan(table=[[tpch-sf0.01/csv, orders]])}} {{ EnumerableProject(l_suppkey0=[$16], l_orderkey0=[$17], $f0=[true])}} {{ EnumerableFilter(condition=[<>($4, $16)])}} {{ EnumerableHashJoin(condition=[=($8, $17)], joinType=[inner])}} {{ EnumerableTableScan(table=[[tpch-sf0.01/csv, lineitem]])}} {{ EnumerableAggregate(group=[\{0, 1}])}} {{ EnumerableProject(l_suppkey=[$11], l_orderkey=[$15])}} {{ EnumerableNestedLoopJoin(condition=[true], joinType=[inner])}} {{ EnumerableNestedLoopJoin(condition=[true], joinType=[inner])}} {{ EnumerableNestedLoopJoin(condition=[true], joinType=[inner])}} {{ EnumerableTableScan(table=[[tpch-sf0.01/csv, supplier]])}} {{ EnumerableTableScan(table=[[tpch-sf0.01/csv, lineitem]])}} {{ EnumerableTableScan(table=[[tpch-sf0.01/csv, orders]])}} {{ EnumerableTableScan(table=[[tpch-sf0.01/csv, nation]])}}{quote} -- This message was sent by Atlassian Jira (v8.20.1#820001)