• Peter Geoghegan's avatar
    Add nbtree high key "continuescan" optimization. · 29b64d1d
    Peter Geoghegan authored
    Teach nbtree forward index scans to check the high key before moving to
    the right sibling page in the hope of finding that it isn't actually
    necessary to do so.  The new check may indicate that the scan definitely
    cannot find matching tuples to the right, ending the scan immediately.
    We already opportunistically force a similar "continuescan orientated"
    key check of the final non-pivot tuple when it's clear that it cannot be
    returned to the scan due to being dead-to-all.  The new high key check
    is complementary.
    
    The new approach for forward scans is more effective than checking the
    final non-pivot tuple, especially with composite indexes and non-unique
    indexes.  The improvements to the logic for picking a split point added
    by commit fab25024 make it likely that relatively dissimilar high keys
    will appear on a page.  A distinguishing key value that can only appear
    on non-pivot tuples on the right sibling page will often be present in
    leaf page high keys.
    
    Since forcing the final item to be key checked no longer makes any
    difference in the case of forward scans, the existing extra key check is
    now only used for backwards scans.  Backward scans continue to
    opportunistically check the final non-pivot tuple, which is actually the
    first non-pivot tuple on the page (not the last).
    
    Note that even pg_upgrade'd v3 indexes make use of this optimization.
    
    Author: Peter Geoghegan, Heikki Linnakangas
    Reviewed-By: Heikki Linnakangas
    Discussion: https://postgr.es/m/CAH2-WzkOmUduME31QnuTFpimejuQoiZ-HOf0pOWeFZNhTMctvA@mail.gmail.com
    29b64d1d
nbtree.h 32.9 KB