• Tom Lane's avatar
    Make large sequential scans and VACUUMs work in a limited-size "ring" of · d526575f
    Tom Lane authored
    buffers, rather than blowing out the whole shared-buffer arena.  Aside from
    avoiding cache spoliation, this fixes the problem that VACUUM formerly tended
    to cause a WAL flush for every page it modified, because we had it hacked to
    use only a single buffer.  Those flushes will now occur only once per
    ring-ful.  The exact ring size, and the threshold for seqscans to switch into
    the ring usage pattern, remain under debate; but the infrastructure seems
    done.  The key bit of infrastructure is a new optional BufferAccessStrategy
    object that can be passed to ReadBuffer operations; this replaces the former
    StrategyHintVacuum API.
    
    This patch also changes the buffer usage-count methodology a bit: we now
    advance usage_count when first pinning a buffer, rather than when last
    unpinning it.  To preserve the behavior that a buffer's lifetime starts to
    decrease when it's released, the clock sweep code is modified to not decrement
    usage_count of pinned buffers.
    
    Work not done in this commit: teach GiST and GIN indexes to use the vacuum
    BufferAccessStrategy for vacuum-driven fetches.
    
    Original patch by Simon, reworked by Heikki and again by Tom.
    d526575f
vacuumlazy.c 35.2 KB