• Tom Lane's avatar
    Invent a "one-shot" variant of CachedPlans for better performance. · 94afbd58
    Tom Lane authored
    SPI_execute() and related functions create a CachedPlan, execute it once,
    and immediately discard it, so that the functionality offered by
    plancache.c is of no value in this code path.  And performance measurements
    show that the extra data copying and invalidation checking done by
    plancache.c slows down simple queries by 10% or more compared to 9.1.
    However, enough of the SPI code is shared with functions that do need plan
    caching that it seems impractical to bypass plancache.c altogether.
    Instead, let's invent a variant version of cached plans that preserves
    99% of the API but doesn't offer any of the actual functionality, nor the
    overhead.  This puts SPI_execute() performance back on par, or maybe even
    slightly better, than it was before.  This change should resolve recent
    complaints of performance degradation from Dong Ye, Pavel Stehule, and
    others.
    
    By avoiding data copying, this change also reduces the amount of memory
    needed to execute many-statement SPI_execute() strings, as for instance in
    a recent complaint from Tomas Vondra.
    
    An additional benefit of this change is that multi-statement SPI_execute()
    query strings are now processed fully serially, that is we complete
    execution of earlier statements before running parse analysis and planning
    on following ones.  This eliminates a long-standing POLA violation, in that
    DDL that affects the behavior of a later statement will now behave as
    expected.
    
    Back-patch to 9.2, since this was a performance regression compared to 9.1.
    (In 9.2, place the added struct fields so as to avoid changing the offsets
    of existing fields.)
    
    Heikki Linnakangas and Tom Lane
    94afbd58
spi_priv.h 3.6 KB