Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[FIX] res_currency: add order by to _select_companies_rates query #98844

Closed
wants to merge 1 commit into from

Commits on Nov 18, 2022

  1. [FIX] res_currency: add order by to _select_companies_rates query

    PG12 introduced an optimization for CTEs that automatically inlines
    CTEs if they are only refered once in the parent query. Prior to that
    CTEs were always materialzed, meaning that PG created a sort of temp
    table on the fly to store the result of the CTE's evaluation.
    
    Whereas this leads to performance improvements in general, in the
    particular case of _select_companies_rates this inlining becomes a
    performance bottleneck. This is because while the currency_rate CTE
    is only refered once in both purchase_report and product_margin,
    the join condition (cr.date_end is null or cr.date_end > ...)
    requires evaluating the CTE's date_end subquery twice. This, combined
    with the fact that in PG12 the planner goes for a Nested Loop JOIN instead
    of a HASH Join in PG10 makes the performances of the whole query
    much worse in PG12 than in PG10.
    
    Adding an ORDER BY (or an OFFSET 0, the resulting plan is the same)
    creates a kind of optimization fence that forces PG to evaluate the
    subquery first using its own plan. This removes the need to rescan the
    subquery each time the Merge JOIN filter has to be applied, which
    is a good strategy in this specific situation.
    
    The same result could be achieved by adding the keyword "MATERIALIZED"
    in the CTE definition. The issue is that this keyword did not exist
    in PG 10 so using it would require to check the PG version at runtime
    from python.
    
    Examples of query timings change before and after PR:
    
    Number of POs | Before PR | After PR
          2000    |     7s    |    345ms
          7000    |     23s   |    1.1s
    
    opw-2930578
    Aurelienvd committed Nov 18, 2022
    Configuration menu
    Copy the full SHA
    cb9adb4 View commit details
    Browse the repository at this point in the history