F.9. btree_gist — Классы операторов GiST с поведением B-дерева#

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 (), Oleg Bartunov (), Janko Richter (), и Paul Jungwirth (). См. http://www.sai.msu.su/~megera/postgres/gist/ для дополнительной информации.