Re: Adding skip scan (including MDAM style range skip scan) to nbtree
BharatDB <bharatdbpg@gmail.com>
Commits
GET /api/v1/messages/:b64id/commits
the thread's linked commits as JSON, with link sources.
API reference →
-
nbtree: Always set skipScan flag on rescan.
- 454c046094ab 19 (unreleased) landed
- bee763aea13f 18.0 landed
-
meson: Build numeric.c with -ftree-vectorize.
- 9016fa7e3bcd 19 (unreleased) cited
-
Fix "variable not found in subplan target lists" in semijoin de-duplication.
- b8a1bdc458e3 19 (unreleased) cited
-
Revert "nbtree: Remove useless row compare arg."
- dd2ce3792754 18.0 landed
-
nbtree: Remove useless row compare arg.
- 54c6ea8c81db 18.0 cited
-
Prevent premature nbtree array advancement.
- 5f4d98d4f371 18.0 landed
-
nbtree: tighten up array recheck rules.
- 7e25c9363a82 18.0 landed
-
Avoid treating nonrequired nbtree keys as required.
- 0f08df406822 18.0 landed
-
Adjust overstrong nbtree skip array assertion.
- 9d924dbb3710 18.0 landed
-
Make NULL tuple values always advance skip arrays.
- b75fedcab791 18.0 cited
-
Avoid extra index searches through preprocessing.
- b3f1a13f22f9 18.0 landed
-
Improve nbtree skip scan primitive scan scheduling.
- 21a152b37f36 18.0 landed
-
Further optimize nbtree search scan key comparisons.
- 8a510275dd6b 18.0 landed
-
Add nbtree skip scan optimization.
- 92fe23d93aa3 18.0 landed
-
Improve nbtree array primitive scan scheduling.
- 9a2e2a285a14 18.0 landed
-
nbtree: Make BTMaxItemSize into object-like macro.
- 426ea611171d 18.0 landed
-
Show index search count in EXPLAIN ANALYZE, take 2.
- 0fbceae841cb 18.0 landed
-
Make parallel nbtree index scans use an LWLock.
- 67fc4c9fd7fa 18.0 landed
-
Show index search count in EXPLAIN ANALYZE.
- 5ead85fbc811 18.0 landed
-
Avoid nbtree parallel scan currPos confusion.
- b5ee4e52026b 18.0 cited
-
nbtree: Remove useless 'strat' local variable.
- b6558e4f837e 18.0 landed
-
Normalize nbtree truncated high key array behavior.
- 79fa7b3b1a44 18.0 landed
-
Refactor handling of nbtree array redundancies.
- b524974106ac 18.0 landed
-
Fix nbtree pgstats accounting with parallel scans.
- c00c54a9ac1e 18.0 landed
- fb4f5e58af97 17.0 landed
-
Avoid parallel nbtree index scan hangs with SAOPs.
- d8adfc18bebf 18.0 landed
- a24bffc021d9 17.0 landed
-
Show Parallel Bitmap Heap Scan worker stats in EXPLAIN ANALYZE
- 5a1e6df3b84c 18.0 cited
-
Enhance nbtree ScalarArrayOp execution.
- 5bf748b86bc6 17.0 cited
-
Skip checking of scan keys required for directional scan in B-tree
- e0b1ee17dc3a 17.0 cited
-
Instead of using a numberOfRequiredKeys count to distinguish required
- 7ccaf13a06b8 8.2.0 cited
Attachments
- 0001-Use-static-allocation-for-IndexAmRoutine-in-amapi.c-.patch (text/x-patch) patch 0001
Hi Team, As a follow-up to the skip scan regression discussion, I tested a small patch that introduces *static allocation/caching of `IndexAmRoutine` *objects in `amapi.c`, removing the malloc/free overhead. *Test setup :* - Baseline: PG17 (commit before skip scan) - After: PG18 build with skip scan (patched) - pgbench scale=1, 100 partitions - Query: `select count(*) from pgbench_accounts where bid = 0` - Clients: 1, 4, 32 - Protocols: simple, prepared *Results (tps, 10s runs) :* Mode Clients Before (PG17) After (PG18 w/ static fix) simple 1 23856 20332 (~15% lower) simple 4 55299 53184 (~4% lower) simple 32 79779 78347 (~2% lower) prepared 1 26364 26615 (no regression) prepared 4 55784 54437 (~2% lower) prepared 32 84687 80374 (~5% lower) This shows the static fix eliminates the severe ~50% regression previously observed by Tomas, leaving only a small residual slowdown (*~2-15%*). *Patch summary :* - Cache `IndexAmRoutine` instances per AM OID instead of malloc/free per call. - Avoid `pfree(amroutine)` in hot paths. - Keeps allocations stable across lookups, reducing malloc churn. *Proposal :* I suggest adopting this static allocation approach for PG18 to prevent performance cliffs. Longer term, we can explore lighter-weight caching mechanisms or further executor tuning. *Patch attached for discussion.* Thanks & Regards, Athiyaman M On Sat, Aug 30, 2025 at 4:37 AM Tomas Vondra <tomas@vondra.me> wrote: > On 8/29/25 21:03, Peter Geoghegan wrote: > > On Fri, Aug 29, 2025 at 9:10 AM Tomas Vondra <tomas@vondra.me> wrote: > >> Peter, any thoughts on this. Do you think it's reasonable / feasible to > >> push the fix? > > > > I don't feel comfortable pushing that fix today. > > > > Understood. > > > Honestly, I'm still not sure what to do. My proposal was to just > > remove the totally unused options support function, which is probably > > fine. But since I don't really know why Alexander ever added the > > "options" support function in the first place (I don't even see a > > theoretical benefit), I'm not quite prepared to say that I know that > > it's okay to remove it now. > > > > Right. I think removing the "options" is the only feasible solution for > PG18 at this point. Either that or nothing. The other patch is far too > invasive. > > As for why the support procedure was added to existing index AMs, I > don't know. I suppose it as mostly for consistency, so that custom > oclasses could opclasses could use that. I have no idea if there are > plausible custom opclasses using this. > > I'm not sure how I feel about removing the support proc. It feels pretty > arbitrary and fragile, and IIRC it doesn't even address the perf issue > (add a couple partitions and it'll hit the same issue). It just restores > the "threshold" to where it was for PG17. And it's fragile, because we > have no protections about hitting this glibc-specific behavior again. It > takes one new flag added somewhere, and we'll not even notice it. > > So after thinking about this a bit more, and refreshing the context, I > think the right solution for PG18 is to do nothing. > > regards > > -- > Tomas Vondra > > > >