Re: Adding skip scan (including MDAM style range skip scan) to nbtree
Tomas Vondra <tomas@vondra.me>
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 9/19/24 21:22, Peter Geoghegan wrote: > On Mon, Sep 16, 2024 at 6:05 PM Tomas Vondra <tomas@vondra.me> wrote: >> For example, one of the slowed down queries is query 702 (top of page 8 >> in the PDF). The query is pretty simple: >> >> explain (analyze, timing off, buffers off) >> select id1,id2 from t_1000000_1000_1_2 >> where NOT (id1 in (:list)) AND (id2 = :value); >> >> and it was executed on a table with random data in two columns, each >> with 1000 distinct values. > > I cannot recreate this problem using the q702.sql repro you provided. > Feels like I'm missing a step, because I find that skip scan wins > nicely here. > I don't know, I can reproduce it just fine. I just tried with v7. What I do is this: 1) build master and patched versions: ./configure --enable-depend --prefix=/mnt/data/builds/$(build}/ make -s clean make -s -j4 install 2) create a new cluster (default config), create DB, generate the data 3) restart cluster, drop caches 4) run the query from the SQL script I suspect you don't do (3). I didn't mention this explicitly, my message only said "with uncached data", so maybe that's the problem? >> This is perfectly random data, so a great >> match for the assumptions in costing etc. > > FWIW, I wouldn't say that this is a particularly sympathetic case for > skip scan. It's definitely still a win, but less than other cases I > can imagine. This is due to the relatively large number of rows > returned by the scan. Plus 1000 distinct leading values for a skip > array isn't all that low, so we end up scanning over 1/3 of all of the > leaf pages in the index. > I wasn't suggesting it's a sympathetic case for skipscan. My point is that it perfectly matches the costing assumptions, i.e. columns are independent etc. But if it's not sympathetic, maybe the cost shouldn't be 1/5 of cost from master? > BTW, be careful to distinguish between leaf pages and internal pages > when interpreting "Buffers:" output with the patch. Generally > speaking, the patch repeats many internal page accesses, which needs > to be taken into account when compare "Buffers:" counts against > master. It's not uncommon for 3/4 or even 4/5 of all index page hits > to be for internal pages with the patch. Whereas on master the number > of internal page hits is usually tiny. This is one reason why the > additional context provided by "Index Searches:" can be helpful. > Yeah, I recall there's an issue with that. >> But with uncached data, this runs in ~50 ms on master, but takes almost >> 200 ms with skipscan (these timings are from my laptop, but similar to >> the results). > > Even 50ms seems really slow for your test case -- with or without my > patch applied. > > Are you sure that this wasn't an assert-enabled build? There's lots of > extra assertions for the code paths used by skip scan for this, which > could explain the apparent regression. > > I find that this same query takes only ~2.056 ms with the patch. When > I disabled skip scan locally via "set skipscan_prefix_cols = 0" (which > should give me behavior that's pretty well representative of master), > it takes ~12.039 ms. That's exactly what I'd expect for this query: a > solid improvement, though not the really enormous ones that you'll see > when skip scan is able to avoid reading many of the index pages that > master reads. > I'm pretty sure you're doing this on cached data, because 2ms is exactly the timing I see in that case. regards -- Tomas Vondra