• Tom Lane's avatar
    Improve performance of "simple expressions" in PL/pgSQL. · 8f59f6b9
    Tom Lane authored
    For relatively simple expressions (say, "x + 1" or "x > 0"), plpgsql's
    management overhead exceeds the cost of evaluating the expression.
    This patch substantially improves that situation, providing roughly
    2X speedup for such trivial expressions.
    
    First, add infrastructure in the plancache to allow fast re-validation
    of cached plans that contain no table access, and hence need no locks.
    Teach plpgsql to use this infrastructure for expressions that it's
    already deemed "simple" (which in particular will never contain table
    references).
    
    The fast path still requires checking that search_path hasn't changed,
    so provide a fast path for OverrideSearchPathMatchesCurrent by
    counting changes that have occurred to the active search path in the
    current session.  This is simplistic but seems enough for now, seeing
    that PushOverrideSearchPath is not used in any performance-critical
    cases.
    
    Second, manage the refcounts on simple expressions' cached plans using
    a transaction-lifespan resource owner, so that we only need to take
    and release an expression's refcount once per transaction not once per
    expression evaluation.  The management of this resource owner exactly
    parallels the existing management of plpgsql's simple-expression EState.
    
    Add some regression tests covering this area, in particular verifying
    that expression caching doesn't break semantics for search_path changes.
    
    Patch by me, but it owes something to previous work by Amit Langote,
    who recognized that getting rid of plancache-related overhead would
    be a useful thing to do here.  Also thanks to Andres Freund for review.
    
    Discussion: https://postgr.es/m/CAFj8pRDRVfLdAxsWeVLzCAbkLFZhW549K+67tpOc-faC8uH8zw@mail.gmail.com
    8f59f6b9
resowner.h 2.76 KB