| From: | Haibo Yan <tristan(dot)yim(at)gmail(dot)com> |
|---|---|
| To: | David Geier <geidav(dot)pg(at)gmail(dot)com> |
| Cc: | Tomás Senart <ts(at)perfloop(dot)ai>, pgsql-hackers(at)lists(dot)postgresql(dot)org, John Naylor <johncnaylorls(at)gmail(dot)com> |
| Subject: | Re: [PATCH v1] Batch B-tree TIDs when building a bitmap |
| Date: | 2026-10-09 22:57:45 |
| Message-ID: | CABXr29GkSCvQzq8bwWgt4vJt_9Uy6hMOEzSPdgBET25Fj+4-Ng@mail.gmail.com |
| Views: | Whole Thread | Raw Message | Download mbox | Resend email |
| Thread: | |
| Lists: | pgsql-hackers |
On Fri, Oct 9, 2026 at 2:12 AM David Geier <geidav(dot)pg(at)gmail(dot)com> wrote:
>
> > The same optimization can be applied, by the way, to at least the GIST,
> > the GIN and the HASH index implementations. I'll do that the next days
> > when I find some time.
> Done for B-tree, hash, GiST, GIN, SP-GiST, and bloom indexes.
> Attached patch passes tests.
>
> Also created a commit fest entry:
> https://commitfest.postgresql.org/patch/7422/
>
> --
> David Geier
Hi David,
I reviewed v2 and also looked back at my local benchmark results for
the B-tree batching path.
The commit message now explains the two relevant effects well: reuse
of the current TIDBitmap page entry and amortization of per-call
overhead.
One B-tree implementation detail still seems worth changing. The copy
loop updates so->currPos.itemIndex for every TID. Using a local index
and updating itemIndex once after the copy improved the 10M-row
workload by another 2.24% in my tests. The new hash code uses the same
pattern and could use the same cleanup.
I also measured a small regression for a B-tree scan returning ten
widely spaced keys:
baseline: 33.195 us
patched: 33.569 us
delta: +0.85%
I do not consider that a blocker, but it shows that copying into a
batch is not free for tiny sparse scans.
The main new aspect of v2 is that batching is now applied to hash,
GiST, GIN, SP-GiST, and bloom as well. I do not see an obvious
semantic problem with separating exact and recheck batches, since the
TIDBitmap recheck flag is maintained at page level.
However, my measurements demonstrate the benefit for B-tree, not
necessarily for all of the newly covered access methods. Their result
ordering and heap-page locality can be quite different. I think those
additions need targeted measurements, or could be split into follow-up
patches.
A couple of smaller points:
gistScanPage() allocates both page-sized arrays even for non-bitmap
scans.
The SP-GiST buffers enlarge every scan opaque, including tuple scans.
A comment explaining the B-tree primitive-scan loop and the
BTScanPosItem copy would help.
There are a few pgindent and 80-column issues in the new code.
The B-tree batching approach still looks worthwhile to me. I would
apply the local-index cleanup there, but I would want some performance
evidence for the newly added access methods before treating the whole
v2 patch as ready.
Thanks,
Haibo
| From | Date | Subject | |
|---|---|---|---|
| Next Message | surya poondla | 2026-10-09 23:18:44 | Re: pg_walinspect: add functions to locate and list WAL by time and LSN |
| Previous Message | ahmed | 2026-10-09 22:42:02 | Re: Use instr_time for pg_stat_database block read/write time counters |