Re: index prefetching
Andres Freund <andres@anarazel.de>
Commits
GET /api/v1/messages/:b64id/commits
the thread's linked commits as JSON, with link sources.
API reference →
-
aio: io_uring: Trigger async processing for large IOs
- a9ee66881744 19 (unreleased) landed
-
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
-
read_stream: Prevent distance from decaying too quickly
- 6e36930f9aaf 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
-
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
Hi, On 2025-07-16 15:39:58 -0400, Andres Freund wrote: > Looking at the actual patches now. I just did an initial, not particularly in depth look. A few comments and questions below. For either patch, I think it's high time we split the index/table buffer stats in index scans. It's really annoying to not be able to see if IO time was inside the index itself or in the table. What we're discussing here obviously can never avoid stalls due to fetching index pages, but so far neither patch is able to fully utilize hardware when bound on heap fetches, but that's harder to know without those stats. The BufferMatches() both patches add seems to check more than needed? It's not like the old buffer could have changed what relation it is for while pinned. Seems like it'd be better to just keep track what the prior block was and not go into bufmgr.c at all. WRT the complex patch: Maybe I'm missing something, but the current interface doesn't seem to work for AMs that don't have a 1:1 mapping between the block number portion of the tid and the actual block number? Currently the API wouldn't easily allow the table AM to do batched TID lookups - if you have a query that looks at a lot of table tuples in the same buffer consecutively, we spend a lot of time locking/unlocking said buffer. We also spend a lot of time dispatching from nodeIndexscan.c to tableam in such queries. I'm not suggesting to increase the scope to handle that, but it might be worth keeping in mind. I think the potential gains here are really substantial. Even just not having to lock/unlock the heap block for every tuple in the page would be a huge win, a quick and incorrect hack suggests it's like 25% faster A batched heap_hot_search_buffer() could be a larger improvement, it's often bound by memory latency and per-call overhead. I see some slowdown for well-cached queries with the patch, I've not dug into why. WRT the simple patch: Seems to have the same issue that it assumes TID block numbers correspond to actual disk location? Greetings, Andres Freund