• Tom Lane's avatar
    Invent PageIndexTupleOverwrite, and teach BRIN and GiST to use it. · b1328d78
    Tom Lane authored
    PageIndexTupleOverwrite performs approximately the same function as
    PageIndexTupleDelete (or PageIndexDeleteNoCompact) followed by PageAddItem
    targeting the same item pointer offset.  But in the case where the new
    tuple is the same size as the old, it avoids shuffling other data around on
    the page, because the new tuple is placed where the old one was rather than
    being appended to the end of the page.  This has been shown to provide a
    substantial speedup for some GiST use-cases.
    
    Also, this change allows some API simplifications: we can get rid of
    the rather klugy and error-prone PAI_ALLOW_FAR_OFFSET flag for
    PageAddItemExtended, since that was used only to cover a corner case
    for BRIN that's better expressed by using PageIndexTupleOverwrite.
    
    Note that this patch causes a rather subtle WAL incompatibility: the
    physical page content change represented by certain WAL records is now
    different than it was before, because while the tuples have the same
    itempointer line numbers, the tuples themselves are in different places.
    I have not bumped the WAL version number because I think it doesn't matter
    unless you are trying to do bitwise comparisons of original and replayed
    pages, and in any case we're early in a devel cycle and there will probably
    be more WAL changes before v10 gets out the door.
    
    There is probably room to make use of PageIndexTupleOverwrite in SP-GiST
    and GIN too, but that is left for a future patch.
    
    Andrey Borodin, reviewed by Anastasia Lubennikova, whacked around a bit
    by me
    
    Discussion: <CAJEAwVGQjGGOj6mMSgMwGvtFd5Kwe6VFAxY=uEPZWMDjzbn4VQ@mail.gmail.com>
    b1328d78
brin_xlog.c 6.48 KB