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-tree 的行为。
总的来说,这些算子类的性能不会超过等效的标准 B-tree 索引方法,并且它们缺少标准 B-tree 代码的一项主要功能:强制唯一性的能力。但是,它们提供了一些 B-tree 索引所不具备的其他功能,如下所述。此外,当需要多列 GiST 索引时,这些算子类会很有用,其中一些列是只能用 GiST 索引的数据类型,而其他列只是简单的数据类型。最后,这些算子类对于 GiST 测试以及作为开发其他 GiST 算子类的方法很有用。
除了典型的 B-tree 搜索算子之外,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 构建GiST索引时处于 已排序 模式下的 sortsupport。这通常会大大加快索引构建速度。通过在创建索引时使用 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/。