• Tom Lane's avatar
    Fix performance hazard in REFRESH MATERIALIZED VIEW CONCURRENTLY. · 6fbd5cce
    Tom Lane authored
    Jeff Janes discovered that commit 7ca25b7d made one of the queries run by
    REFRESH MATERIALIZED VIEW CONCURRENTLY perform badly.  The root cause is
    bad cardinality estimation for correlated quals, but a principled solution
    to that problem is some way off, especially since the planner lacks any
    statistics about whole-row variables.  Moreover, in non-error cases this
    query produces no rows, meaning it must be run to completion; but use of
    LIMIT 1 encourages the planner to pick a fast-start, slow-completion plan,
    exactly not what we want.  Remove the LIMIT clause, and instead rely on
    the count parameter we pass to SPI_execute() to prevent excess work if the
    query does return some rows.
    
    While we've heard no field reports of planner misbehavior with this query,
    it could be that people are having performance issues that haven't reached
    the level of pain needed to cause a bug report.  In any case, that LIMIT
    clause can't possibly do anything helpful with any existing version of the
    planner, and it demonstrably can cause bad choices in some cases, so
    back-patch to 9.4 where the code was introduced.
    
    Thomas Munro
    
    Discussion: https://postgr.es/m/CAMkU=1z-JoGymHneGHar1cru4F1XDfHqJDzxP_CtK5cL3DOfmg@mail.gmail.com
    6fbd5cce
matview.c 27 KB