Re: Adding skip scan (including MDAM style range skip scan) to nbtree
Dmitry Dolgov <9erthalion6@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
> On Wed, Jun 26, 2024 at 03:16:07PM GMT, Peter Geoghegan wrote: > > Loose index scan is a far more specialized technique than skip scan. > It only applies within special scans that feed into a DISTINCT group > aggregate. Whereas my skip scan patch isn't like that at all -- it's > much more general. With my patch, nbtree has exactly the same contract > with the executor/core code as before. There are no new index paths > generated by the optimizer to make skip scan work, even. Skip scan > isn't particularly aimed at improving group aggregates (though the > benchmark I'll show happens to involve a group aggregate, simply > because the technique works best with large and expensive index > scans). I see that the patch is not supposed to deal with aggregates in any special way. But from what I understand after a quick review, skip scan is not getting applied to them if there are no quals in the query (in that case _bt_preprocess_keys returns before calling _bt_preprocess_array_keys). Yet such queries could benefit from skipping, I assume they still could be handled by the machinery introduced in this patch? > > Currently, there is an assumption that "there will be 10 primitive index scans > > per skipped attribute". Is any chance to use pg_stats.n_distinct? > > It probably makes sense to use pg_stats.n_distinct here. But how? > > If the problem is that we're too pessimistic, then I think that this > will usually (though not always) make us more pessimistic. Isn't that > the wrong direction to go in? (We're probably also too optimistic in > some cases, but being too pessimistic is a bigger problem in > practice.) > > For example, your test case involved 11 distinct values in each > column. The current approach of hard-coding 10 (which is just a > temporary hack) should actually make the scan look a bit cheaper than > it would if we used the true ndistinct. > > Another underlying problem is that the existing SAOP costing really > isn't very accurate, without skip scan -- that's a big source of the > pessimism with arrays/skipping. Why should we be able to get the true > number of primitive index scans just by multiplying together each > omitted prefix column's ndistinct? That approach is good for getting > the worst case, which is probably relevant -- but it's probably not a > very good assumption for the average case. (Though at least we can cap > the total number of primitive index scans to 1/3 of the total number > of pages in the index in btcostestimate, since we have guarantees > about the worst case as of Postgres 17.) Do I understand correctly, that the only way how multiplying ndistincts could produce too pessimistic results is when there is a correlation between distinct values? Can one benefit from the extended statistics here? And while we're at it, I think it would be great if the implementation will allow some level of visibility about the skip scan. From what I see, currently it's by design impossible for users to tell whether something was skipped or not. But when it comes to planning and estimates, maybe it's not a bad idea to let explain analyze show something like "expected number of primitive scans / actual number of primitive scans".