Re: index prefetching
Peter Geoghegan <pg@bowt.ie>
Attachments
- v17-0001-Track-index-only-scan-heap-fetches-using-IndexSc.patch (application/octet-stream) patch v17-0001
- v17-0017-WIP-instrumentation-Account-for-resource-usage-u.patch (application/octet-stream) patch v17-0017
- v17-0018-Dirty-hack-to-make-read_stream_reset-end-not-wai.patch (application/octet-stream) patch v17-0018
- v17-0016-WIP-aio-io_uring-Use-IO-size-not-IO-queue-to-tri.patch (application/octet-stream) patch v17-0016
- v17-0015-WIP-read_stream-Prevent-distance-from-decaying-t.patch (application/octet-stream) patch v17-0015
- v17-0014-WIP-read_stream-Only-increase-distance-when-wait.patch (application/octet-stream) patch v17-0014
- v17-0013-bufmgr-Return-whether-WaitReadBuffers-needed-to-.patch (application/octet-stream) patch v17-0013
- v17-0011-WIP-read_stream-Issue-IO-synchronously-while-in-.patch (application/octet-stream) patch v17-0011
- v17-0012-WIP-aio-io_uring-Allow-IO-methods-to-check-if-IO.patch (application/octet-stream) patch v17-0012
- v17-0010-Don-t-wait-for-already-in-progress-IO.patch (application/octet-stream) patch v17-0010
- v17-0008-Make-hash-index-AM-use-amgetbatch-interface.patch (application/octet-stream) patch v17-0008
- v17-0009-Make-buffer-hit-helper.patch (application/octet-stream) patch v17-0009
- v17-0006-Add-UnlockBufferGetLSN-utility-function.patch (application/octet-stream) patch v17-0006
- v17-0005-Optimize-heap-buffer-pin-transfer-for-last-in-bl.patch (application/octet-stream) patch v17-0005
- v17-0007-Add-heapam-index-scan-I-O-prefetching.patch (application/octet-stream) patch v17-0007
- v17-0004-Implement-VISITED_PAGES_LIMIT-within-heapam.patch (application/octet-stream) patch v17-0004
- v17-0003-Add-interfaces-that-enable-index-prefetching.patch (application/octet-stream) patch v17-0003
- v17-0002-heapam-Track-heap-block-in-IndexFetchHeapData-us.patch (application/octet-stream) patch v17-0002
On Sat, Mar 21, 2026 at 7:01 PM Peter Geoghegan <pg@bowt.ie> wrote: > I can immediately act on most of what you've said here. I'm planning > to commit the first patch (and maybe the hash index fake LSN patch) in > the next couple of days, ahead of posting a new v17 of the patch set. > You can expect any item I reply to with "fixed" or similar to be in > that version. Other items might not be addressed in v17 -- generally > because I require more context or feedback to act. > > I'm going to work through both this email and the later one from today > before posting this v17. What I've said applies equally to both > reviews/emails. I committed the fake LSN hash index patch (as commit e5836f7b), as well as the "Make IndexScanInstrumentation a pointer in executor scan nodes" patch (as commit f026fbf0). V17 is attached. This addresses most of your feedback, but defers dealing with the trickier parts for now. I didn't want to delay producing a new version that cleanly applies on top of master. Performance validation takes at least as long as writing the code, with these sorts of changes. Notable things that I have *not* done just yet: * No new heapam_index.c file in this version (though there is an indexbatch.h). * No split of table AM revisions that pushes down VM accesses for index-only scans into its own commit (though there are a couple of new patches that were split from the big one to keep the size of the commits slightly more manageable, as promised). * No progress on splitting the batch management code currently in heapam_handler.c into smaller, reusable/modular pieces. Pieces that other table AMs can reuse. * Recently, Andres asked, "Does it really make sense to not just have 2 separate loops from within heapam_batch_resolve_visibility?". That is a question that remains unanswered, for now. Notable changes (things that I *have* done) include: * Cleaned up the mess of carrying around four full-length, specialized versions of the table AM index scan slot callback. We still specialize, but now there's only one generic pg_attribute_always_inline function definition, which is called by all four specializations. The compiler can create specialized versions because the amgetbatch + index_only_scan parameters are constants (four specializations for all four combinations of amgetbatch + index_only_scan boolean parameters). * Lots of renaming and polishing, along the lines requested in your review. Basically, everything I specifically told you I would do soon in my initial responses over the past couple of days has been completed. A large number of small things, that aren't worth noting individually. -- Peter Geoghegan
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