[ 
https://issues.apache.org/jira/browse/CALCITE-4494?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

ASF GitHub Bot updated CALCITE-4494:
------------------------------------
    Labels: performance pull-request-available  (was: performance)

>  Improve planning performance with RelSubset check for Rel presence
> -------------------------------------------------------------------
>
>                 Key: CALCITE-4494
>                 URL: https://issues.apache.org/jira/browse/CALCITE-4494
>             Project: Calcite
>          Issue Type: Improvement
>          Components: core
>    Affects Versions: 1.26.0
>         Environment: All environments
>            Reporter: Igor Lozynskyi
>            Priority: Major
>              Labels: performance, pull-request-available
>             Fix For: 1.27.0
>
>         Attachments: CalcitePerf_Planning_RelList_consumes_a_lot.png, 
> CalcitePerf_Planning_TPCH_Q7_RelList_consumes_a_lot.png, 
> CalcitePerf_Planning_after_improvements.png
>
>          Time Spent: 10m
>  Remaining Estimate: 0h
>
> *Problem*
> Currently, the planning process shows a performance degradation when 
> comparing to version 1.25. Worse palling time seems to affect most queries, 
> but it is especially clear for queries with many Rel nodes (especially with 
> multiple joins).
> In a downstream project, we have a stress test that checks the planning time. 
> In some cases, the planning time is increased by x4 (for a query with 28 
> joins).
> The main contributing factor (but not the only one) for the slow-down could 
> be traced to [https://github.com/apache/calcite/pull/2222/files].
> *Potential Solution*
> As it was mentioned by the reviewers, we may improve the current situation 
> with some tiny changes:
>  * Introduce a method to check that a Rel node belongs to the RelSubset 
> instead of getting all Rel nodes (the current code may take up to 60% of the 
> planning time).
> *  Improve the null check in RelMdPredicates by building an error message in 
> RelMdPredicates.ExprsItr only when it is required (may additionally take 10% 
> of the planning time due to SortedMap.toString() being expensive when 
> frequently called).
> With these 2 changes, I was able to regain most of the lost planning 
> performance.
> The following flame graph clearly shows that the call to 
> RelSubset.getRelList() from VolcanoRuleCall.onMatch() is expensive (28 join 
> query):
>  !CalcitePerf_Planning_RelList_consumes_a_lot.png|width=865,height=365!
> After the proposed improvements, the flame graph shows the following (28 join 
> query):
>     !CalcitePerf_Planning_after_improvements.png|width=561,height=472!
> It is clear that the HintStrategyTable.isRuleExcluded() call is expensive, 
> but the overall picture is much better.
> Also, in my environment, the TPC-H Q7 test takes ~20% less time (39.6 sec vs 
> 32.9 sec) after the proposed improvements. Here, the flame graph also shows 
> that ordinary queries are also affected by the redundant 
> RelSubset.getRelList() calls:
> !CalcitePerf_Planning_TPCH_Q7_RelList_consumes_a_lot.png|width=856,height=573!
>  



--
This message was sent by Atlassian Jira
(v8.3.4#803005)

Reply via email to