Re: index prefetching
Tomas Vondra <tomas@vondra.me>
Hi, On 2/15/26 01:13, Alexandre Felipe wrote: > Hi, > I decided to test this PR. > > I didn't take much time to go through the thread or the code in detail > yet. But I have my first benchmark results and I would like to share. > I'm quite confused by the scripts you shared, it seems incomplete. The run_regression.py is meant to call purge_cache.sh (which is missing), and the run_benchmark tries to call all sorts of missing .sql scripts. So how do we use that? > EXPERIMENT > > I tested [CF 4351] v10 - Index Prefetching > > I created a table with 100k rows and > Sequential is, as guessed, 1,2,3,4 (indexed) > Periodic is a quasi random (i * jump) % num_rows, where gcd(jump, > num_rows) = 1, guarantee that there are no repeated entries (indexed) > Random is a `row_number() over (order by random())` (indexed) > The payload is a fixed 200 character long string, just to make it more > realistic. > > For the tests, I disable sorting, sequential scans, index only scans and > bitmap scans. > Since buffer cache always has a significant impact on the query > performance, I shuffled the tests, and tried to adjust for the number of > buffer hit/read, but later I found that the best way to control that was > to use a table small enough to be entirely held in cache, and evict the > buffers. > That seems a bit bizarre. The whole point of index prefetching is better I/O scheduling (ahead of time), but if you "control" the impact of cache by making sure everything is cached, that kinda defeats the whole thing. A table that is just 24MB and fits into buffers is a bit useless. It means that even with random pattern (which is generally about the best for prefetching), only about ~1/30 of pages will require I/O. Each page has ~32 items, but only the first item from each page will incur an I/O. > * off: buffers are kept in cache > * pg: buffers evicted from postgres pg_buffercache_evict from > pg_buffercache extension. > * os: supported only in python, I separated the buffer eviction in > purge_cache as it requires sudo (tested only in MacOS). > > I varied > * max_parallel_workers_per_gather (although I guess it wasn't exploited), > * enable_index_prefetch > * the column used as sorting key and, as a result, the index used. > * and buffer eviction mode. > > Running from python with psycopg > On what kind of hardware? How much variance is in the results? regards -- Tomas Vondra
Commits
-
read stream: Split decision about look ahead for AIO and combining
- 8ca147d582a5 19 (unreleased) landed
-
read_stream: Only increase read-ahead distance when waiting for IO
- f63ca3379025 19 (unreleased) landed
-
aio: io_uring: Trigger async processing for large IOs
- a9ee66881744 19 (unreleased) landed
-
heapam: Keep buffer pins across index scan resets.
- 2d3490dd99f0 19 (unreleased) landed
-
heapam: Track heap block in IndexFetchHeapData.
- c7d09595e46f 19 (unreleased) landed
-
Move heapam_handler.c index scan code to new file.
- a29fdd6c8d81 19 (unreleased) landed
-
Rename heapam_index_fetch_tuple argument for clarity.
- 1adff1a0c558 19 (unreleased) landed
-
Optimize fast-path FK checks with batched index probes
- b7b27eb41a5c 19 (unreleased) cited
-
read_stream: Prevent distance from decaying too quickly
- 6e36930f9aaf 19 (unreleased) landed
-
read_stream: Issue IO synchronously while in fast path
- cceb1bf45e3a 19 (unreleased) landed
-
bufmgr: Return whether WaitReadBuffers() needed to wait
- 513374a47a71 19 (unreleased) landed
-
aio: io_uring: Allow IO methods to check if IO completed in the background
- 6e648e353fa0 19 (unreleased) landed
-
bufmgr: Make UnlockReleaseBuffer() more efficient
- f39cb8c01106 19 (unreleased) cited
-
Add fake LSN support to hash index AM.
- e5836f7b7d9a 19 (unreleased) landed
-
Make IndexScanInstrumentation a pointer in executor scan nodes.
- f026fbf059f2 19 (unreleased) landed
-
Use fake LSNs to improve nbtree dropPin behavior.
- 8a879119a1d1 19 (unreleased) landed
-
Move fake LSN infrastructure out of GiST.
- d774072f0040 19 (unreleased) landed
-
Use simplehash for backend-private buffer pin refcounts.
- a367c433ad01 19 (unreleased) landed
-
nbtree: Avoid allocating _bt_search stack.
- d071e1cfec23 19 (unreleased) landed
-
bufmgr: Fix use of wrong variable in GetPrivateRefCountEntrySlow()
- 6322a028fa43 19 (unreleased) landed
-
Conditional locking in pgaio_worker_submit_internal
- 29a0fb215779 19 (unreleased) landed
-
Reduce ExecSeqScan* code size using pg_assume()
- b227b0bb4e03 19 (unreleased) cited
-
Fix rare bug in read_stream.c's split IO handling.
- b421223172a2 19 (unreleased) cited
-
Remove HeapBitmapScan's skip_fetch optimization
- 459e7bf8e2f8 18.0 cited
-
Optimize nbtree backwards scans.
- 1bd4bc85cac2 18.0 cited
-
Fix multiranges to behave more like dependent types.
- 3e8235ba4f9c 17.0 cited
-
Add EXPLAIN (MEMORY) to report planner memory consumption
- 5de890e3610d 17.0 cited
-
Optimize nbtree backward scan boundary cases.
- c9c0589fda0e 17.0 cited
-
Increment xactCompletionCount during subtransaction abort.
- 90c885cdab8b 14.0 cited
-
Add nbtree Valgrind buffer lock checks.
- 4a70f829d86c 14.0 cited
-
Add nbtree high key "continuescan" optimization.
- 29b64d1de7c7 12.0 cited
-
Reduce pinning and buffer content locking for btree scans.
- 2ed5b87f96d4 9.5.0 cited
-
Teach btree to handle ScalarArrayOpExpr quals natively.
- 9e8da0f75731 9.2.0 cited