Перейти к основному содержимому

btree_gist — классы операторов GiST с поведением B-дерева

примечание

Эта страница переведена при помощи нейросети GigaChat.

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 для текущей базы данных.

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

Простой пример с использованием 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