Aleksandr Efimov created IMPALA-15312:
-----------------------------------------

             Summary: Show when an HBO cardinality changed a plan decision
                 Key: IMPALA-15312
                 URL: https://issues.apache.org/jira/browse/IMPALA-15312
             Project: IMPALA
          Issue Type: Improvement
          Components: Frontend
            Reporter: Aleksandr Efimov


h3. Problem

IMPALA-15236 puts the provenance of an HBO cardinality next to the number: the 
canonicalization strategy that matched, the hash key, the estimate the planner 
had computed on its own, and the ratio between the two. That answers where the 
number came from. It does not answer whether the number changed the plan.

The two questions come apart. Decisions that consume cardinalities are cost 
based, so a corrected estimate can flip one while leaving the shape of the plan 
alone. Join inversion is the clearest case: {{Planner.invertJoins()}} inverts a 
join when {{isInvertedJoinCheaper()}} says so, and that check is a function of 
the two children's cardinality and average row size. Correct the build side and 
the verdict can flip, so a join that was planned inverted goes back. The number 
of joins does not change, the broadcast/partitioned mix does not change, and 
the operator histogram of the plan does not change - only the side each join 
builds on.

This is not hypothetical. On an outer-join-heavy query, HBO correcting a 
build-side aggregate from a few thousand rows down to fourteen turned sixty 
joins back from RIGHT OUTER to LEFT OUTER, and a comparison of the two plans by 
operator counts reported them as the same plan.

Answering "what did HBO do to this plan" today means running the query twice, 
once with {{use_hbo_stats=false}}, and diffing the two plans. On a report that 
runs for minutes that is a measurement exercise rather than debugging.

h3. Proposed change

Mark the nodes where the HBO substitution changed a planner decision, not only 
the estimate, in the plan and in the profile.

Two directions, each with a cost worth weighing:

* Plan twice under a debug query option and diff the results. Exact, and only 
paid for when someone asks for it.
* Carry the pre-HBO estimate through the cardinality computation and 
re-evaluate the cost based decisions with it. No second planning pass, but it 
has to propagate: a node whose own key did not match can still get a different 
cardinality because a descendant matched, and 
{{PlanNode.cardinalityBeforeHbo_}} stays -1 on such a node, so a check that 
reads only that field reports no change where there was one.

h3. Note for the comparison itself

Plan node ids are handed out as nodes are constructed, before {{invertJoins()}} 
runs, and exchange nodes are numbered afterwards by the distributed planner. 
Two plans of the same query built from different estimates need not agree on 
ids, so a diff keyed on node id can report differences that are only numbering.



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

---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to