F.9. btree_gist — Классы операторов GiST с поведением B-дерева#
F.9. btree_gist — Классы операторов GiST с поведением B-дерева #
btree_gist
предоставляет классы операторов индекса GiST, которые реализуют поведение эквивалентное B-дереву для типов данных int2
, int4
, int8
, float4
, float8
, numeric
, timestamp with time zone
, timestamp without time zone
, time with time zone
, time without time zone
, date
, interval
, oid
, money
, char
, varchar
, text
, bytea
, bit
, varbit
, macaddr
, macaddr8
, inet
, cidr
, uuid
, bool
и всех типов enum
.
В целом, эти классы операторов не будут превосходить эквивалентные стандартные методы индексирования B-дерева и не обладают одной основной особенностью стандартного кода B-дерева: возможностью обеспечения уникальности. Однако они предоставляют некоторые другие функции, которые недоступны с индексом B-дерева, как описано ниже. Кроме того, эти классы операторов полезны, когда требуется многоколоночный индекс GiST, в котором некоторые из столбцов имеют типы данных, которые можно индексировать только с помощью GiST, но другие столбцы имеют простые типы данных. Наконец, эти классы операторов полезны для тестирования GiST и в качестве основы для разработки других классов операторов GiST.
В дополнение к типичным операторам поиска в B-дереве, btree_gist
также предоставляет поддержку индексов для оператора <>
(“не равно”). Это может быть полезно в сочетании с ограничением на исключение, как описано ниже.
Также, для типов данных, для которых существует естественная метрика расстояния,
btree_gist
определяет оператор расстояния <->
,
и обеспечивает поддержку индекса GiST для поиска ближайших соседей с использованием
этого оператора. Операторы расстояния предоставляются для
int2
, int4
, int8
, float4
,
float8
, timestamp with time zone
,
timestamp without time zone
,
time without time zone
, date
, interval
,
oid
и money
.
Этот модуль считается "доверенным", то есть его можно установить
недоступным пользователям, у которых есть привилегия CREATE
в текущей базе данных.
F.9.1. Пример использования #
Простой пример, использующий btree_gist
вместо btree
:
CREATE TABLE test (a int4); -- create index CREATE INDEX testidx ON test USING GIST (a); -- query SELECT * FROM test WHERE a < 10; -- nearest-neighbor search: find the ten entries closest to "42" SELECT *, a <-> 42 AS dist FROM test ORDER BY a <-> 42 LIMIT 10;
Используйте исключительное ограничение, чтобы обеспечить правило, согласно которому в клетке зоопарка может находиться только один вид животного.
=> CREATE TABLE zoo ( cage INTEGER, animal TEXT, EXCLUDE USING GIST (cage WITH =, animal WITH <>) ); => INSERT INTO zoo VALUES(123, 'zebra'); INSERT 0 1 => INSERT INTO zoo VALUES(123, 'zebra'); INSERT 0 1 => INSERT INTO zoo VALUES(123, 'lion'); ERROR: conflicting key value violates exclusion constraint "zoo_cage_animal_excl" DETAIL: Key (cage, animal)=(123, lion) conflicts with existing key (cage, animal)=(123, zebra). => INSERT INTO zoo VALUES(124, 'lion'); INSERT 0 1
F.9.2. Авторы #
Teodor Sigaev (<teodor@stack.net>
),
Oleg Bartunov (<oleg@sai.msu.su>
),
Janko Richter (<jankorichter@yahoo.de>
), и
Paul Jungwirth (<pj@illuminatedcomputing.com>
). См.
http://www.sai.msu.su/~megera/postgres/gist/
для дополнительной информации.