Re: [PoC] Improve dead tuple storage for lazy vacuum

Masahiko Sawada <sawada.mshk@gmail.com>

From: Masahiko Sawada <sawada.mshk@gmail.com>
To: John Naylor <john.naylor@enterprisedb.com>
Cc: Nathan Bossart <nathandbossart@gmail.com>, Andres Freund <andres@anarazel.de>, Matthias van de Meent <boekewurm+postgres@gmail.com>, Yura Sokolov <y.sokolov@postgrespro.ru>, PostgreSQL-development <pgsql-hackers@postgresql.org>
Date: 2022-12-27T06:39:02Z
Lists: pgsql-hackers
On Tue, Dec 27, 2022 at 2:24 PM John Naylor
<john.naylor@enterprisedb.com> wrote:
>
> On Tue, Dec 27, 2022 at 12:14 AM Masahiko Sawada <sawada.mshk@gmail.com> wrote:
> >
> > On Fri, Dec 23, 2022 at 8:47 PM John Naylor
> > <john.naylor@enterprisedb.com> wrote:
>
> > These 4 patches make sense to me.We can merge them into 0002 patch
>
> Okay, then I'll squash them when I post my next patch.
>
> > and I'll do similar changes for functions for leaf nodes as well.
>
> I assume you meant something else? -- some of the differences between inner and leaf are already abstracted away.

Right. If we template these routines I don't need that.

>
> In any case, some things are still half-baked, so please wait until my next patch before doing work on these files.
>
> Also, CI found a bug on 32-bit -- I know what I missed and will fix next week.

Thanks!

>
> > > 0010 and 0011 template a common implementation for both leaf and inner nodes for searching and inserting.
> > >
> > > 0012: While at it, I couldn't resist using this technique to separate out delete from search, which makes sense and might give a small performance boost (at least on less capable hardware). I haven't got to the iteration functions, but they should be straightforward.
>
> Two things came to mind since I posted this, which I'll make clear next patch:
> - A good compiler will get rid of branches when inlining, so maybe no difference in code generation, but it still looks nicer this way.
> - Delete should really use its own template, because it only _accidentally_ looks like search because we don't yet shrink nodes.

Okay.

>
> > What do you
> > think about how we can expand this template method to deal with DSA
> > memory? I imagined that we load say radixtree_template.h with some
> > macros to use the radix tree like we do for simplehash.h. And
> > radixtree_template.h further loads xxx_impl.h files for some internal
> > functions.
>
> Right, I was thinking the same. I wanted to start small and look for opportunities to shrink the code footprint.

Thank you for your confirmation!

Regards,

-- 
Masahiko Sawada
Amazon Web Services: https://aws.amazon.com



Commits

  1. radixtree: Fix SIGSEGV at update of embeddable value to non-embeddable.

  2. Get rid of anonymous struct

  3. Teach radix tree to embed values at runtime

  4. Teach TID store to skip bitmap for small numbers of offsets

  5. Use bump context for TID bitmaps stored by vacuum

  6. Fix alignment of stack variable

  7. Use TidStore for dead tuple TIDs storage during lazy vacuum.

  8. Rethink create and attach APIs of shared TidStore.

  9. Fix inconsistent function prototypes with function definitions.

  10. Fix a calculation in TidStoreCreate().

  11. Fix potential integer handling issue in radixtree.h.

  12. Add TIDStore, to store sets of TIDs (ItemPointerData) efficiently.

  13. Fix link error for test_radixtree module on Windows

  14. Blind attempt to fix ODR violations

  15. Fix incorrect format specifier for int64

  16. Fix redefinition of typedefs

  17. Add template for adaptive radix tree

  18. Fix signedness error in 9f225e992 for gcc

  19. Introduce helper SIMD functions for small byte arrays

  20. Optimize vacuuming of relations with no indexes.

  21. Add bound check before bsearch() for performance

  22. Allocate consecutive blocks during parallel seqscans