Re: index prefetching
Tomas Vondra <tomas@vondra.me>
On 2/18/26 05:21, Andres Freund wrote: > Hi, > > On 2026-02-17 22:36:53 +0100, Tomas Vondra wrote: >> On 2/17/26 21:16, Peter Geoghegan wrote: >>> On Tue, Feb 17, 2026 at 2:27 PM Andres Freund <andres@anarazel.de> wrote: >>>> On 2026-02-17 12:16:23 -0500, Peter Geoghegan wrote: >>>>> On Mon, Feb 16, 2026 at 11:48 AM Andres Freund <andres@anarazel.de> wrote: >>>>> I agree that the current heuristics (which were invented recently) are >>>>> too conservative. I overfit the heuristics to my current set of >>>>> adversarial queries, as a stopgap measure. >>>> >>>> Are you doing any testing on higher latency storage? I found it to be quite >>>> valuable to use dm_delay to have a disk with reproducible (i.e. not cloud) >>>> higher latency (i.e. not just a local SSD). >>> >>> I sometimes use dm_delay (with the minimum 1ms delay) when testing, >>> but don't do so regularly. Just because it's inconvenient to do so >>> (perhaps not a great reason). >>> >>>> Low latency NVMe can reduce the >>>> penalty of not enough readahead so much that it's hard to spot problems... >>> >>> I'll keep that in mind. >>> >> >> So, what counts as "higher latency" in this context? What delays should >> we consider practical/relevant for testing? > > 0.5-4ms is the range I've seen in various clouds across their reasonable > storage products (i.e. not spinning disks or other ver bulk oriented things). > > Unfortunately dm_delay doesn't support < 1ms delays, but it's still much > better than nothing. > > I've been wondering about teaching AIO to delay IOs (by adding a sleep to > workers and linking a IORING_OP_TIMEOUT submission with the actually intended > IO) to allow testing smaller delays. > Could be useful testing facility, if it's done in a way that does not limit the IO concurrency (i.e. the delay should probably be when consuming the IO, depending on the timestamp of the IO start). > >>> That would make sense. You can already tell when that's happened by >>> comparing the details shown by EXPLAIN ANALYZE against the same query >>> execution on master, but that approach is inconvenient. Automating my >>> microbenchmarks has proven to be important with this project. There's >>> quite a few competing considerations, and it's too easy to improve one >>> query at the cost of regressing another. >>> >> >> What counts as "unconsumed IO"? The IOs the stream already started, but >> then did not consume? That shouldn't be hard, I think. > > Yes, the number of IOs that were started but not consumed. Or, even better, > the number of IOs that completed but were not consumed - but that'd be harder > to get right now. > > I agree that started-but-not-consumed should be pretty easy. > I'll try to add it to the EXPLAIN. 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