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