Re: Adding skip scan (including MDAM style range skip scan) to nbtree
Alena Rybakina <a.rybakina@postgrespro.ru>
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
On 12.03.2025 01:59, Peter Geoghegan wrote: > On Tue, Mar 11, 2025 at 6:24 PM Alena Rybakina > <a.rybakina@postgrespro.ru> wrote: >> Hi, reviewing the code I noticed that you removed the >> parallel_aware check for DSM initialization for BitmapIndexScan, >> IndexScan, IndexOnlyScan, >> but you didn't do the same in the ExecParallelReInitializeDSM function >> and I can't figure out why to be honest. I think it might be wrong or >> I'm missing something. > I didn't exactly remove the check -- not completely. You could say > that I *moved* the check, from the caller (i.e. from functions in > execParallel.c such as ExecParallelInitializeDSM) to the callee (i.e. > into individual executor node functions such as > ExecIndexScanInitializeDSM). I did it that way because it's more > flexible. > > We need this flexibility because we need to allocate DSM for > instrumentation state when EXPLAIN ANALYZE runs a parallel query with > an index scan node -- even when the scan node runs inside a parallel > worker, but is non-parallel-aware (parallel oblivious). Obviously, we > might also need to allocate space for a shared index scan descriptor > (including index AM opaque state), in the same way as before > (or we might need to do both). I see and agree with this changes now. >> As I see, it might be necessary if the parallel executor needs to >> reinitialize the shared memory state before launching a fresh batches of >> workers (it is based on >> the comment of the ExecParallelReinitialize function), and when it >> happens all child nodes reset their state (see the comment next to the >> call to the ExecParallelReInitializeDSM >> function). > I did not move/remove the parallel_aware check in > ExecParallelReInitializeDSM because it doesn't have the same > requirements -- we *don't* need that flexibility there, because it > isn't necessary (or correct) to reinitialize anything when the only > thing that's in DSM is instrumentation state. (Though I did add an > assertion about parallel_aware-ness to functions like > ExecIndexScanReInitializeDSM, which I thought might make this a little > clearer to people reading files like nodeIndexScan.c, and wondering > why ExecIndexScanReInitializeDSM doesn't specifically test > parallel_aware.) > > Obviously, these node types don't have their state reset (quoting > ExecParallelReInitializeDSM switch statement here): > > case T_BitmapIndexScanState: > case T_HashState: > case T_SortState: > case T_IncrementalSortState: > case T_MemoizeState: > /* these nodes have DSM state, but no reinitialization is > required */ > break; > > I added T_BitmapIndexScanState to the top of this list -- the rest are > from before today's commit. I did this since (like the other nodes > shown) BitmapIndexScan's use of DSM is limited to instrumentation > state -- which we never want to reset (there is no such thing as a > parallel bitmap index scan, though bitmap index scans can run in > parallel workers, and still need the instrumentation to work with > EXPLAIN ANALYZE). > > We still need to call functions like ExecIndexOnlyScanReInitializeDSM > from here/ExecParallelReInitializeDSM, of course, but that won't reset > the new instrumentation state (because my patch didn't touch it at > all, except for adding that assertion I already mentioned in passing). > > We actually specifically rely on *not* resetting the shared memory > state to get correct behavior in cases like this one: > > https://www.postgresql.org/message-id/CAAKRu_YjBPfGp85ehY1t9NN%3DR9pB9k%3D6rztaeVkAm-OeTqUK4g%40mail.gmail.com > > See comments about this in places like ExecEndBitmapIndexScan (added > by today's commit), or in ExecEndBitmapHeapScan (added by the similar > bitmap heap instrumentation patch discussed on that other thread, > which became commit 5a1e6df3). > > Thank you for the explanation! Now I see why these changes were made. After your additional explanations, everything really became clear and I fully agree with the current code regarding this part. However I did not see an explanation to the commit regarding this place, as well as a comment next to the assert and the parallel_aware check and why BitmapIndexScanState was added in the ExecParallelReInitializeDSM. In my opinion, there is not enough additional explanation about this in the form of comments, although I think that it has already been explained here enough for someone who will look at this code. -- Regards, Alena Rybakina Postgres Professional