PostgreSQL 中文参考文档
🌐 英文原版 官方 ↗

F.8. btree_gist — 具有 B 树行为的 GiST 操作符类 #

F.8.1. 用法示例
F.8.2. 作者

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 权限的非超级用户也可以安装它。

F.8.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.8.2. 作者 #

Teodor Sigaev ()、 Oleg Bartunov ()、 Janko Richter () 与 Paul Jungwirth ()。更多信息请参阅 http://www.sai.msu.su/~megera/postgres/gist/。