Add TID Range Scans to support efficient scanning ranges of TIDs
authorDavid Rowley <drowley@postgresql.org>
Sat, 27 Feb 2021 09:59:36 +0000 (22:59 +1300)
committerDavid Rowley <drowley@postgresql.org>
Sat, 27 Feb 2021 09:59:36 +0000 (22:59 +1300)
commitbb437f995d47405ecd92cf66df71f7f7e40ed460
tree0ee50f8a501e1ecc30d5cfd0eeb6ed0bcd41e2b2
parentf4adc41c4f92cc91d507b19e397140c35bb9fd71
Add TID Range Scans to support efficient scanning ranges of TIDs

This adds a new executor node named TID Range Scan.  The query planner
will generate paths for TID Range scans when quals are discovered on base
relations which search for ranges on the table's ctid column.  These
ranges may be open at either end. For example, WHERE ctid >= '(10,0)';
will return all tuples on page 10 and over.

To support this, two new optional callback functions have been added to
table AM.  scan_set_tidrange is used to set the scan range to just the
given range of TIDs.  scan_getnextslot_tidrange fetches the next tuple
in the given range.

For AMs were scanning ranges of TIDs would not make sense, these functions
can be set to NULL in the TableAmRoutine.  The query planner won't
generate TID Range Scan Paths in that case.

Author: Edmund Horner, David Rowley
Reviewed-by: David Rowley, Tomas Vondra, Tom Lane, Andres Freund, Zhihong Yu
Discussion: https://postgr.es/m/CAMyN-kB-nFTkF=VA_JPwFNo08S0d-Yk0F741S2B7LDmYAi8eyA@mail.gmail.com
36 files changed:
src/backend/access/heap/heapam.c
src/backend/access/heap/heapam_handler.c
src/backend/commands/explain.c
src/backend/executor/Makefile
src/backend/executor/execAmi.c
src/backend/executor/execCurrent.c
src/backend/executor/execProcnode.c
src/backend/executor/nodeTidrangescan.c [new file with mode: 0644]
src/backend/nodes/copyfuncs.c
src/backend/nodes/outfuncs.c
src/backend/optimizer/README
src/backend/optimizer/path/costsize.c
src/backend/optimizer/path/tidpath.c
src/backend/optimizer/plan/createplan.c
src/backend/optimizer/plan/setrefs.c
src/backend/optimizer/plan/subselect.c
src/backend/optimizer/util/pathnode.c
src/backend/optimizer/util/plancat.c
src/backend/optimizer/util/relnode.c
src/backend/storage/page/itemptr.c
src/include/access/heapam.h
src/include/access/relscan.h
src/include/access/tableam.h
src/include/catalog/pg_operator.dat
src/include/executor/nodeTidrangescan.h [new file with mode: 0644]
src/include/nodes/execnodes.h
src/include/nodes/nodes.h
src/include/nodes/pathnodes.h
src/include/nodes/plannodes.h
src/include/optimizer/cost.h
src/include/optimizer/pathnode.h
src/include/storage/itemptr.h
src/test/regress/expected/tidrangescan.out [new file with mode: 0644]
src/test/regress/parallel_schedule
src/test/regress/serial_schedule
src/test/regress/sql/tidrangescan.sql [new file with mode: 0644]