F.5. btree_gist
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
, inet
和cidr
B-tree等价操作。
总的来说,这些操作符类不会超过等值标准的B树索引方法, 他们缺乏标准B树代码的一个主要特点:强制唯一性的能力。然而, 它们提供一些不可用于B树索引的其他功能,正如下面描述的。 另外当需要多列GiST索引时, 这些操作符类是有用的, 其中一些列是唯一可以使用GiST可索引的数据类型 但是其他列仅仅是简单的数据类型。 最终,这些操作符类对GiST测试是有用的, 并且作为开发其他GiST操作符类的基础。
除了典型的B树搜索操作符,btree_gist
还提供索引支持<>
("不等")。 这可能在与 exclusion constraint结合中很用, 正如下面描述。
另外,对于数据类型是一种天然的距离度量, 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.5.1. 例子用法
使用btree_gist
而不是btree
的简单例子:
CREATE TABLE test (a int4);
-- 创建索引
CREATE INDEX testidx ON test USING gist (a);
-- 查询
SELECT * FROM test WHERE a < 10;
-- 最近相邻搜索:找到最接近"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.5.2. 作者
Teodor Sigaev (<[[email protected]](mailto:[email protected])>
), Oleg Bartunov (<[[email protected]](mailto:[email protected])>
)和 Janko Richter (<[[email protected]](mailto:[email protected])>
)。参阅 http://www.sai.msu.su/~megera/postgres/gist/ 获取额外信息。