pgsql.cc 提供对 postgresql.org 官网内容的中文翻译,由 Pigsty 团队维护。
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, inet, 和 cidr。
一般来说,这些操作符类的性能不会优于对应的标准 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代替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>)。更多信息见 http://www.sai.msu.su/~megera/postgres/gist/。
译文有误、术语不当或页面显示问题,请到译文仓库 pgsty/pgdoc 报告译文问题。 英文原文本身的问题,请在当前版本的对应页面向上游反馈;上游不再修订已结束维护的版本。