On Fri, May 9, 2025 at 9:06 AM Tomas Vondra <to...@vondra.me> wrote: > Good question. I haven't checked that explicitly, but it's a tiny data > set (15MB) and I observed this even on long benchmarks with tens of > millions of queries. So the hint bits should have been set. > > Also, I should have mentioned the query does an index-only scan, and the > pin/unpin calls are on index pages, not on the heap.
We don't actually need to call BufferGetLSNAtomic() from _bt_readpage during index-only scans (nor during bitmap index scans). We can just not call BufferGetLSNAtomic() at all (except during plain index scans), with no possible downside. In general, we call BufferGetLSNAtomic() to stash the page LSN within so->currPos.lsn, for later. so->currPos.lsn provides us with a way to detect whether the page was modified during the period in which we dropped our pin on the leaf page -- plain index scans cannot set LP_DEAD bits on dead index tuples within _bt_killitems() if the page has changed. But, index-only scans never drop the pin on the leaf page to begin with, and so don't even use so->currPos.lsn (bitmap index scans *never* call _bt_killitems(), and so obviously have no possible use for so->currPos.lsn, either). -- Peter Geoghegan