Bonnie Varghese created FLINK-40797:
---------------------------------------

             Summary: Exclude NestedLoopJoin from CBO search space when an 
equi-join condition exists and another equi-capable strategy is applicable
                 Key: FLINK-40797
                 URL: https://issues.apache.org/jira/browse/FLINK-40797
             Project: Flink
          Issue Type: Improvement
          Components: Table SQL / Planner
            Reporter: Bonnie Varghese
            Assignee: Bonnie Varghese


`BatchPhysicalJoinRuleBase.checkNestLoopJoin` currently lets nested-loop join 
(NLJ) compete on cost alone against `BroadcastHashJoin`, `ShuffleHashJoin`, and 
`SortMergeJoin`, even for plain equi-joins. When the cost model underestimates 
cardinality (i.e. due to partial stats e.g. missing NDV/column stats), NLJ's 
O(m·n) cost can look artificially cheaper than a hash-based join's O(m+n) cost, 
so the CBO picks NLJ for a join that has an equi-condition and could just as 
well use a hash-based strategy.

With row-count stats alone, TPC-DS Q47's self-join regressed onto a nested-loop 
join instead of a hash join under this condition, blowing up runtime.

Proposed fix:

In checkNestLoopJoin, once we already know the join is an equi-join 
(isEquivJoin) and at least one equi-capable strategy is applicable to it, 
remove NLJ from the candidate set entirely rather than relying on the cost 
comparison to sort it out. An explicit NEST_LOOP join hint still overrides this 
and forces NLJ.



Note: This narrows how often NLJ is selectable at plan time but does not 
address the runtime case where a job discovers mid-execution that its build 
side is far larger than the optimizer estimated (see FLINK-16165)



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to