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 树同等的性能。
通常情况下,这些运算符类的性能不会优于等效的标准 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
。
此模块被视为是 “受信任的”,即可以由对当前数据库拥有 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 (<[email protected]>
)、Oleg Bartunov (<[email protected]>
)、Janko Richter (<[email protected]>
) 和 Paul Jungwirth (<[email protected]>
)。有关更多信息,请访问http://www.sai.msu.su/~megera/postgres/gist/。