btree_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 树等价行为的 GiST 索引操作符类。
通常,这些操作符类的性能不会超过等效的标准 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。
默认情况下,btree_gist 以 排序 模式构建带有 sortsupport 的 GiST 索引。这通常会大幅加快索引构建速度。创建索引时仍然可以通过使用 buffering 参数恢复到缓冲构建策略。
该模块被视为“可信”模块,也就是说,拥有当前数据库 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/。