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/。
如果您在文档中发现任何不正确之处、与您对特定功能的体验不符之处或需要进一步澄清之处,请使用 此表格 报告文档问题。