F.5. 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, inetcidr B-tree等价操作。

总的来说,这些操作符类不会超过等值标准的B树索引方法, 他们缺乏标准B树代码的一个主要特点:强制唯一性的能力。然而, 它们提供一些不可用于B树索引的其他功能,正如下面描述的。 另外当需要多列GiST索引时, 这些操作符类是有用的, 其中一些列是唯一可以使用GiST可索引的数据类型 但是其他列仅仅是简单的数据类型。 最终,这些操作符类对GiST测试是有用的, 并且作为开发其他GiST操作符类的基础。

除了典型的B树搜索操作符,btree_gist 还提供索引支持<> ("不等")。 这可能在与 exclusion constraint结合中很用, 正如下面描述。

另外,对于数据类型是一种天然的距离度量, btree_gist定义了一个距离操作符<->, 并且使用该操作符为最近相邻搜索提供GiST索引支持。 为int2, int4, int8, float4, float8, timestamp with time zone, timestamp without time zone, time without time zone, date, interval, oidmoney提供距离操作符。

F.5.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.5.2. 作者

Teodor Sigaev (), Oleg Bartunov ()和 Janko Richter ()。参阅 http://www.sai.msu.su/~megera/postgres/gist/ 获取额外信息。