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
Teodor Sigaev(<teodor@stack.net>)、 Oleg Bartunov(<oleg@sai.msu.su>)、 Janko Richter(<jankorichter@yahoo.de>)和 Paul Jungwirth(<pj@illuminatedcomputing.com>)。更多信息见 http://www.sai.msu.su/~megera/postgres/gist/。
如果您发现文档中有不正确的内容、与您使用特定功能的经验不符或需要进一步说明,请使用此表单来报告文档问题。