Avoid pointer chasing in _bt_readpage inner loop. master github/master
authorPeter Geoghegan <pg@bowt.ie>
Mon, 8 Dec 2025 18:48:09 +0000 (13:48 -0500)
committerPeter Geoghegan <pg@bowt.ie>
Mon, 8 Dec 2025 18:48:09 +0000 (13:48 -0500)
commit83a26ba59b1819cbd61705a3ff6aa572081ccc4b
treeab9e0358d80b4baf660dd8c76123237c636577ce
parentd0d0ba6cf66c4043501f6f7bf508ad920645e415
Avoid pointer chasing in _bt_readpage inner loop.

Make _bt_readpage pass down the current scan direction to various
utility functions within its pstate variable.  Also have _bt_readpage
work off of a local copy of scan->ignore_killed_tuples within its
per-tuple loop (rather than using scan->ignore_killed_tuples directly).

Testing has shown that this significantly benefits large range scans,
which are naturally able to take full advantage of the pstate.startikey
optimization added by commit 8a510275.  Running a pgbench script with a
"SELECT abalance FROM pgbench_accounts WHERE aid BETWEEN ..." query
shows an increase in transaction throughput of over 5%.  There also
appears to be a small performance benefit when running pgbench's
built-in select-only script.

Follow-up to commit 65d6acbc.

Author: Peter Geoghegan <pg@bowt.ie>
Reviewed-By: Victor Yegorov <vyegorov@gmail.com>
Discussion: https://postgr.es/m/CAH2-WzmwMwcwKFgaf+mYPwiz3iL4AqpXnwtW_O0vqpWPXRom9Q@mail.gmail.com
src/backend/access/nbtree/nbtreadpage.c