codecamp

PostgreSQL btree_gist

btree_gist为数据类型 int2int4int8float4float8numerictimestamp with time zonetimestamp without time zonetime with time zonetime without time zonedateintervaloidmoneycharvarchartextbyteabitvarbitmacaddrmacaddr8inetcidruuid和所有enum 类型提供了实现 B 树等效行为的 GiST 索引操作符类。

通常,这些操作符类不会比等效的标准 B 树索引方法更好,并且它们缺少标准 B 树代码的一个主要特性:强制一致性的能力。但是,如下文所述,它们提供了在一个 B 树索引中没有的一些其他特性。另外,当需要一个多列 GiST 索引,并且其某些列的数据类型只在 GiST 中是可索引的而其他列是简单数据类型时,这些操作符类就有用了。最后,这些操作符可以用于 GiST 测试以及作为开发其他 GiST 操作符类的基础。

除了典型的 B 树搜索操作符之外,btree_gist也为<>不等于)提供了索引支持。这可能与下文描述的排他约束组合在一起产生作用。

另外,对于那些具有自然距离度量的数据类型,btree_gist定义了一个距离操作符<->,并且为使用这个操作符的最近邻搜索提供了 GiST 索引支持。距离操作符还提供给了:int2int4int8float4float8timestamp with time zonetimestamp without time zonetime without time zonedateintervaloidmoney

这个模块被认为是 trusted, 也就是说, 它可以被当前数据库中拥有CREATE特权的非超级用户安装。

F.7.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


PostgreSQL btree_gin
PostgreSQL citext
温馨提示
下载编程狮App,免费阅读超1000+编程语言教程
取消
确定
目录

PostgreSQL SQL语言

PostgreSQL 服务器管理

PostgreSQL 客户端接口

PostgreSQL 服务器编程

PostgreSQL 参考

PostgreSQL 内部

PostgreSQL 附录

PostgreSQL 参考书目

关闭

MIP.setData({ 'pageTheme' : getCookie('pageTheme') || {'day':true, 'night':false}, 'pageFontSize' : getCookie('pageFontSize') || 20 }); MIP.watch('pageTheme', function(newValue){ setCookie('pageTheme', JSON.stringify(newValue)) }); MIP.watch('pageFontSize', function(newValue){ setCookie('pageFontSize', newValue) }); function setCookie(name, value){ var days = 1; var exp = new Date(); exp.setTime(exp.getTime() + days*24*60*60*1000); document.cookie = name + '=' + value + ';expires=' + exp.toUTCString(); } function getCookie(name){ var reg = new RegExp('(^| )' + name + '=([^;]*)(;|$)'); return document.cookie.match(reg) ? JSON.parse(document.cookie.match(reg)[2]) : null; }