• Kevin Grittner's avatar
    Reduce pinning and buffer content locking for btree scans. · 2ed5b87f
    Kevin Grittner authored
    Even though the main benefit of the Lehman and Yao algorithm for
    btrees is that no locks need be held between page reads in an
    index search, we were holding a buffer pin on each leaf page after
    it was read until we were ready to read the next one.  The reason
    was so that we could treat this as a weak lock to create an
    "interlock" with vacuum's deletion of heap line pointers, even
    though our README file pointed out that this was not necessary for
    a scan using an MVCC snapshot.
    
    The main goal of this patch is to reduce the blocking of vacuum
    processes by in-progress btree index scans (including a cursor
    which is idle), but the code rearrangement also allows for one
    less buffer content lock to be taken when a forward scan steps from
    one page to the next, which results in a small but consistent
    performance improvement in many workloads.
    
    This patch leaves behavior unchanged for some cases, which can be
    addressed separately so that each case can be evaluated on its own
    merits.  These unchanged cases are when a scan uses a non-MVCC
    snapshot, an index-only scan, and a scan of a btree index for which
    modifications are not WAL-logged.  If later patches allow  all of
    these cases to drop the buffer pin after reading a leaf page, then
    the btree vacuum process can be simplified; it will no longer need
    the "super-exclusive" lock to delete tuples from a page.
    
    Reviewed by Heikki Linnakangas and Kyotaro Horiguchi
    2ed5b87f
nbtxlog.c 29.5 KB