F.7. btree_gist #
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,以及所有 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。
F.7.1. 用法示例
一个使用 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
F.7.2. 作者
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/。