F.8. btree_gist
Модуль 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
и всех типов enum
.
Вообще говоря, эти классы операторов не будут работать быстрее аналогичных стандартных методов индекса-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
.
F.8.1. Пример использования
Простой пример использования 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). => INSERT INTO zoo VALUES(124, 'lion'); INSERT 0 1
F.8.2. Авторы
Фёдор Сигаев (<teodor@stack.net>
), Олег Бартунов (<oleg@sai.msu.su>
), Янко Рихтер (<jankorichter@yahoo.de>
) и Пол Юнгвирт (<pj@illuminatedcomputing.com>
). Подробности можно найти на странице http://www.sai.msu.su/~megera/postgres/gist/.