Add support for building GiST index by sorting.
authorHeikki Linnakangas <[email protected]>
Thu, 17 Sep 2020 08:33:40 +0000 (11:33 +0300)
committerHeikki Linnakangas <[email protected]>
Thu, 17 Sep 2020 08:33:40 +0000 (11:33 +0300)
commit16fa9b2b30a357b4aea982bd878ec2e5e002dbcc
treed1ee3378a010ad424ce41db8af503d534566cf6e
parent089da3c4778fdc1931f721a265caa0c6fca38584
Add support for building GiST index by sorting.

This adds a new optional support function to the GiST access method:
sortsupport. If it is defined, the GiST index is built by sorting all data
to the order defined by the sortsupport's comparator function, and packing
the tuples in that order to GiST pages. This is similar to how B-tree
index build works, and is much faster than inserting the tuples one by
one. The resulting index is smaller too, because the pages are packed more
tightly, upto 'fillfactor'. The normal build method works by splitting
pages, which tends to lead to more wasted space.

The quality of the resulting index depends on how good the opclass-defined
sort order is. A good order preserves locality of the input data.

As the first user of this facility, add 'sortsupport' function to the
point_ops opclass. It sorts the points in Z-order (aka Morton Code), by
interleaving the bits of the X and Y coordinates.

Author: Andrey Borodin
Reviewed-by: Pavel Borisov, Thomas Munro
Discussion: https://www.postgresql.org/message-id/1A36620E-CAD8-4267-9067-FB31385E7C0D%40yandex-team.ru
17 files changed:
doc/src/sgml/gist.sgml
src/backend/access/gist/gistbuild.c
src/backend/access/gist/gistproc.c
src/backend/access/gist/gistutil.c
src/backend/access/gist/gistvalidate.c
src/backend/access/transam/xloginsert.c
src/backend/utils/sort/sortsupport.c
src/backend/utils/sort/tuplesort.c
src/include/access/gist.h
src/include/access/gist_private.h
src/include/access/xloginsert.h
src/include/catalog/catversion.h
src/include/catalog/pg_amproc.dat
src/include/catalog/pg_proc.dat
src/include/utils/sortsupport.h
src/include/utils/tuplesort.h
src/test/regress/expected/create_index.out