• Teodor Sigaev's avatar
    Skip full index scan during cleanup of B-tree indexes when possible · 857f9c36
    Teodor Sigaev authored
    Vacuum of index consists from two stages: multiple (zero of more) ambulkdelete
    calls and one amvacuumcleanup call. When workload on particular table
    is append-only, then autovacuum isn't intended to touch this table. However,
    user may run vacuum manually in order to fill visibility map and get benefits
    of index-only scans. Then ambulkdelete wouldn't be called for indexes
    of such table (because no heap tuples were deleted), only amvacuumcleanup would
    be called In this case, amvacuumcleanup would perform full index scan for
    two objectives: put recyclable pages into free space map and update index
    statistics.
    
    This patch allows btvacuumclanup to skip full index scan when two conditions
    are satisfied: no pages are going to be put into free space map and index
    statistics isn't stalled. In order to check first condition, we store
    oldest btpo_xact in the meta-page. When it's precedes RecentGlobalXmin, then
    there are some recyclable pages. In order to check second condition we store
    number of heap tuples observed during previous full index scan by cleanup.
    If fraction of newly inserted tuples is less than
    vacuum_cleanup_index_scale_factor, then statistics isn't considered to be
    stalled. vacuum_cleanup_index_scale_factor can be defined as both reloption and GUC (default).
    
    This patch bumps B-tree meta-page version. Upgrade of meta-page is performed
    "on the fly": during VACUUM meta-page is rewritten with new version. No special
    handling in pg_upgrade is required.
    
    Author: Masahiko Sawada, Alexander Korotkov
    Review by: Peter Geoghegan, Kyotaro Horiguchi, Alexander Korotkov, Yura Sokolov
    Discussion: https://www.postgresql.org/message-id/flat/CAD21AoAX+d2oD_nrd9O2YkpzHaFr=uQeGr9s1rKC3O4ENc568g@mail.gmail.com
    857f9c36
Makefile 802 Bytes