postgresql/src/include/access
Peter Geoghegan 79fa7b3b1a Normalize nbtree truncated high key array behavior.
Commit 5bf748b8 taught nbtree ScalarArrayOp index scans to decide when
and how to start the next primitive index scan based on physical index
characteristics.  This included rules for deciding whether to start a
new primitive index scan (or whether to move onto the right sibling leaf
page instead) that specifically consider truncated lower-order columns
(-inf columns) from leaf page high keys.

These omitted columns were treated as satisfying the scan's required
scan keys, though only for scan keys marked required in the current scan
direction (forward).  Scan keys that didn't get this behavior (those
marked required in the backwards direction only) usually didn't give the
scan reasonable cause to reposition itself to a later leaf page (via
another descent of the index in _bt_first), but _bt_advance_array_keys
would nevertheless always give up by forcing another call to _bt_first.

_bt_advance_array_keys was unwilling to allow the scan to continue onto
the next leaf page, to reconsider whether we really should start another
primitive scan based on the details of the sibling page's tuples.  This
didn't match its behavior with similar cases involving keys required in
the current scan direction (forward), which seems unprincipled.  It led
to an excessive number of primitive scans/index descents for queries
with a higher-order = array scan key (with dense, contiguous values)
mixed with a lower-order required > or >= scan key.

Bring > and >= strategy scan keys in line with other required scan key
types: treat truncated -inf scan keys as having satisfied scan keys
required in either scan direction (forwards and backwards alike) during
array advancement.  That way affected scans can continue to the right
sibling leaf page.  Advancement must now schedule an explicit recheck of
the right sibling page's high key in cases involving > or >= scan keys.
The recheck gives the scan a way to back out and start another primitive
index scan (we can't just rely on _bt_checkkeys with > or >= scan keys).

This work can be considered a stand alone optimization on top of the
work from commit 5bf748b8.  But it was written in preparation for an
upcoming patch that will add skip scan to nbtree.  In practice scans
that use "skip arrays" will tend to be much more sensitive to any
implementation deficiencies in this area.

Author: Peter Geoghegan <pg@bowt.ie>
Reviewed-By: Tomas Vondra <tomas@vondra.me>
Discussion: https://postgr.es/m/CAH2-Wz=9A_UtM7HzUThSkQ+BcrQsQZuNhWOvQWK06PRkEp=SKQ@mail.gmail.com
2024-10-16 12:17:49 -04:00
..
amapi.h Add amgettreeheight index AM API routine 2024-09-10 10:03:23 +02:00
amvalidate.h Update copyright for 2024 2024-01-03 20:49:05 -05:00
attmap.h Update copyright for 2024 2024-01-03 20:49:05 -05:00
attnum.h Update copyright for 2024 2024-01-03 20:49:05 -05:00
brin.h Update copyright for 2024 2024-01-03 20:49:05 -05:00
brin_internal.h Add missing index_insert_cleanup calls 2024-04-19 16:08:34 +02:00
brin_page.h Update copyright for 2024 2024-01-03 20:49:05 -05:00
brin_pageops.h Update copyright for 2024 2024-01-03 20:49:05 -05:00
brin_revmap.h Update copyright for 2024 2024-01-03 20:49:05 -05:00
brin_tuple.h Update copyright for 2024 2024-01-03 20:49:05 -05:00
brin_xlog.h Update copyright for 2024 2024-01-03 20:49:05 -05:00
bufmask.h Update copyright for 2024 2024-01-03 20:49:05 -05:00
clog.h Improve performance of subsystems on top of SLRU 2024-02-28 17:05:31 +01:00
commit_ts.h Improve performance of subsystems on top of SLRU 2024-02-28 17:05:31 +01:00
detoast.h Update copyright for 2024 2024-01-03 20:49:05 -05:00
genam.h Fix data loss at inplace update after heap_update(). 2024-09-24 15:25:18 -07:00
generic_xlog.h Update copyright for 2024 2024-01-03 20:49:05 -05:00
gin.h Update copyright for 2024 2024-01-03 20:49:05 -05:00
gin_private.h Use new overflow-safe integer comparison functions. 2024-02-16 14:05:36 -06:00
ginblock.h Update copyright for 2024 2024-01-03 20:49:05 -05:00
ginxlog.h Update copyright for 2024 2024-01-03 20:49:05 -05:00
gist.h Add temporal PRIMARY KEY and UNIQUE constraints 2024-09-17 11:29:30 +02:00
gist_private.h Update copyright for 2024 2024-01-03 20:49:05 -05:00
gistscan.h Update copyright for 2024 2024-01-03 20:49:05 -05:00
gistxlog.h Update copyright for 2024 2024-01-03 20:49:05 -05:00
hash.h Update copyright for 2024 2024-01-03 20:49:05 -05:00
hash_xlog.h Update copyright for 2024 2024-01-03 20:49:05 -05:00
heapam.h Fix data loss at inplace update after heap_update(). 2024-09-24 15:25:18 -07:00
heapam_xlog.h Remove comment about xl_heap_inplace "AT END OF STRUCT". 2024-06-27 19:21:06 -07:00
heaptoast.h Update copyright for 2024 2024-01-03 20:49:05 -05:00
hio.h Update copyright for 2024 2024-01-03 20:49:05 -05:00
htup.h Update copyright for 2024 2024-01-03 20:49:05 -05:00
htup_details.h Update copyright for 2024 2024-01-03 20:49:05 -05:00
itup.h Update copyright for 2024 2024-01-03 20:49:05 -05:00
multixact.h Improve performance of subsystems on top of SLRU 2024-02-28 17:05:31 +01:00
nbtree.h Normalize nbtree truncated high key array behavior. 2024-10-16 12:17:49 -04:00
nbtxlog.h Update copyright for 2024 2024-01-03 20:49:05 -05:00
parallel.h Remove unused ParallelWorkerInfo.pid field 2024-03-04 12:56:02 +02:00
printsimple.h Update copyright for 2024 2024-01-03 20:49:05 -05:00
printtup.h Update copyright for 2024 2024-01-03 20:49:05 -05:00
relation.h Update copyright for 2024 2024-01-03 20:49:05 -05:00
reloptions.h Turn a few 'validnsps' static variables into locals 2024-08-06 23:03:43 +03:00
relscan.h Improve Asserts checking relation matching in parallel scans. 2024-09-20 16:37:55 -04:00
rewriteheap.h Update copyright for 2024 2024-01-03 20:49:05 -05:00
rmgr.h Pre-beta mechanical code beautification. 2022-05-12 15:17:30 -04:00
rmgrdesc_utils.h Update copyright for 2024 2024-01-03 20:49:05 -05:00
rmgrlist.h Update copyright for 2024 2024-01-03 20:49:05 -05:00
sdir.h Fix a series of typos and outdated references 2024-08-12 23:27:09 +12:00
sequence.h Introduce sequence_*() access functions 2024-02-26 16:04:59 +09:00
session.h Update copyright for 2024 2024-01-03 20:49:05 -05:00
skey.h Update copyright for 2024 2024-01-03 20:49:05 -05:00
slru.h Improve comments in slru.{c,h} about segment name format 2024-07-23 16:54:51 +09:00
spgist.h Update copyright for 2024 2024-01-03 20:49:05 -05:00
spgist_private.h Fix insertion of SP-GiST REDIRECT tuples during REINDEX CONCURRENTLY. 2024-06-17 14:30:59 -04:00
spgxlog.h Fix insertion of SP-GiST REDIRECT tuples during REINDEX CONCURRENTLY. 2024-06-17 14:30:59 -04:00
stratnum.h Update copyright for 2024 2024-01-03 20:49:05 -05:00
subtrans.h Improve performance of subsystems on top of SLRU 2024-02-28 17:05:31 +01:00
syncscan.h Move all extern declarations for GUC variables to header files 2024-07-24 06:31:07 +02:00
sysattr.h Update copyright for 2024 2024-01-03 20:49:05 -05:00
table.h Update copyright for 2024 2024-01-03 20:49:05 -05:00
tableam.h Remove extra comment at TableAmRoutine.scan_analyze_next_block 2024-06-22 16:17:50 +03:00
tidstore.h Refactor tidstore.c iterator buffering. 2024-07-24 17:32:35 +12:00
timeline.h Update copyright for 2024 2024-01-03 20:49:05 -05:00
toast_compression.h Update copyright for 2024 2024-01-03 20:49:05 -05:00
toast_helper.h Update copyright for 2024 2024-01-03 20:49:05 -05:00
toast_internals.h Update copyright for 2024 2024-01-03 20:49:05 -05:00
transam.h Update copyright for 2024 2024-01-03 20:49:05 -05:00
tsmapi.h Update copyright for 2024 2024-01-03 20:49:05 -05:00
tupconvert.h Update copyright for 2024 2024-01-03 20:49:05 -05:00
tupdesc.h Separate equalRowTypes() from equalTupleDescs() 2024-03-17 05:58:04 +01:00
tupdesc_details.h Update copyright for 2024 2024-01-03 20:49:05 -05:00
tupmacs.h Update copyright for 2024 2024-01-03 20:49:05 -05:00
twophase.h Allow altering of two_phase option of a SUBSCRIPTION. 2024-07-24 10:13:36 +05:30
twophase_rmgr.h Update copyright for 2024 2024-01-03 20:49:05 -05:00
valid.h Update copyright for 2024 2024-01-03 20:49:05 -05:00
visibilitymap.h Update copyright for 2024 2024-01-03 20:49:05 -05:00
visibilitymapdefs.h Update copyright for 2024 2024-01-03 20:49:05 -05:00
xact.h Extend PgStat_HashKey.objid from 4 to 8 bytes 2024-09-18 12:44:15 +09:00
xlog.h Fix inconsistent reporting of checkpointer stats. 2024-10-02 11:17:47 +09:00
xlog_internal.h Extend PgStat_HashKey.objid from 4 to 8 bytes 2024-09-18 12:44:15 +09:00
xlogarchive.h Update copyright for 2024 2024-01-03 20:49:05 -05:00
xlogbackup.h Update copyright for 2024 2024-01-03 20:49:05 -05:00
xlogdefs.h Update copyright for 2024 2024-01-03 20:49:05 -05:00
xloginsert.h Add const qualifiers to XLogRegister*() functions 2024-09-03 08:06:03 +02:00
xlogprefetcher.h Update copyright for 2024 2024-01-03 20:49:05 -05:00
xlogreader.h Fix a series of typos and outdated references 2024-08-12 23:27:09 +12:00
xlogrecord.h Update copyright for 2024 2024-01-03 20:49:05 -05:00
xlogrecovery.h Update copyright for 2024 2024-01-03 20:49:05 -05:00
xlogstats.h Update copyright for 2024 2024-01-03 20:49:05 -05:00
xlogutils.h Move all extern declarations for GUC variables to header files 2024-07-24 06:31:07 +02:00