btree_gist

Модуль btree_gist предоставляет классы операторов индексов GiST, реализующие поведение, схожее с тем, что реализуют классы В-дерева, для типов данных 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 и всех перечислимых типов (enum).

В целом, эти классы операторов не будут работать быстрее аналогичных стандартных методов индекса В-дерева, и им не хватает одной важной функциональности стандартного кода В-дерева: способности обеспечивать соблюдение уникальности. Тем не менее, они предоставляют несколько других функциональностей (описаны ниже), недоступных с индексом В-деревом. Кроме того, эти классы операторов полезны, когда требуется многостолбцовый индекс 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 в текущей базе данных.


Пример использования

Простой пример использования btree_gist вместо btree:

CREATE TABLE test (a int4);
-- создание индекса
CREATE INDEX testidx ON test USING GIST (a);
-- запрос
SELECT * FROM test WHERE a < 10;
-- поиск ближайших соседей: найти десять записей, ближайших к "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).
-- ОШИБКА: конфликтующее значение ключа нарушает ограничение-исключение "zoo_cage_animal_excl"
-- ДЕТАЛИЗАЦИЯ: Ключ (cage, animal)=(123, lion) конфликтует с существующим ключом (cage, animal)=(123, zebra).
=> INSERT INTO zoo VALUES(124, 'lion');
INSERT 0 1

Авторы

Федор Сигаев (teodor@stack.net), Олег Бартунов (oleg@sai.msu.su), Янко Рихтер (Janko Richter) (jankorichter@yahoo.de) и Пол Юнгвирт (Paul Jungwirth) (pj@illuminatedcomputing.com). Дополнительную информацию можно найти на странице http://www.sai.msu.su/~megera/postgres/gist/.