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、macaddr8、inet、cidr、uuid、bool 和所有 enum 类型实现 B 树等效行为。
一般来说,这些运算符类不会优于等效的标准 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/。
如果您在文档中看到任何不正确、与您对特定功能的体验不符或需要进一步澄清的内容,请使用 此表单 报告文档问题。