↑↓ 选择↵ 打开⌫ 切换范围完整搜索

PG.CENTER 连接 PostgreSQL 文档、百科与生态知识。由 Pigsty 维护。

支持中的版本: 当前版本 (18) / 17 / 16 / 15 / 14
开发中的版本: 19 / 20devel
已结束支持的版本: 13 / 12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0 / 8.4 / 8.3
历史版本。 PostgreSQL 9.4 已结束支持。 2020-02-13. 请参阅 当前版本手册.

F.18. intarray #

intarray模块提供了一些有用的函数和操作符,用于操作不含 NULL 的整数数组。它还支持使用其中某些操作符进行索引搜索。

如果所提供的数组中包含任何 NULL 元素,所有这些操作都会抛出错误。

这些操作中有许多只对一维数组才有意义。尽管它们也接受更高维度的输入数组,但数据会被视为按存储顺序排列的线性数组。

F.18.1. intarray 函数和操作符

intarray模块提供的函数列在表 F.10中,操作符列在表 F.11中。

表 F.10. intarray 函数

函数返回类型 描述 示例结果
icount(int[])int数组中的元素个数icount('{1,2,3}'::int[])3
sort(int[], text dir)int[]对数组排序 — dir必须为asc或descsort('{1,2,3}'::int[], 'desc'){3,2,1}
sort(int[])int[]按升序排序sort(array[11,77,44]){11,44,77}
sort_asc(int[])int[]按升序排序
sort_desc(int[])int[]按降序排序
uniq(int[])int[]删除相邻的重复元素uniq(sort('{1,2,3,2,1}'::int[])){1,2,3}
idx(int[], int item)int与item匹配的第一个元素的索引(如果没有则为 0)idx(array[11,22,33,22,11], 22)2
subarray(int[], int start, int len)int[]从位置start开始的数组部分,共 len 个元素subarray('{1,2,3,2,1}'::int[], 2, 3){2,3,2}
subarray(int[], int start)int[]从位置start开始的数组部分subarray('{1,2,3,2,1}'::int[], 2){2,3,2,1}
intset(int)int[]创建一个只含一个元素的数组intset(42){42}

表 F.11. intarray 操作符

操作符返回值 描述
int[] && int[]boolean重叠 — 如果数组至少有一个共同元素,则为true
int[] @> int[]boolean包含 — 如果左数组包含右数组,则为true
int[] <@ int[]boolean包含于 — 如果左数组包含在右数组中,则为true
# int[]int数组中的元素个数
int[] # intint索引(与idx函数相同)
int[] + intint[]将元素压入数组(添加到数组末尾)
int[] + int[] int[]数组连接(右数组添加到左数组末尾)
int[] - intint[]从数组中移除与右参数匹配的项
int[] - int[]int[]从左数组中移除右数组中的元素
int[] | intint[]参数的并集
int[] | int[]int[]数组的并集
int[] & int[]int[]数组的交集
int[] @@ query_intboolean如果数组满足查询(见下文),则为true
query_int ~~ int[]boolean如果数组满足查询(@@的交换操作符),则为true

(在 PostgreSQL 8.2 之前,包含操作符 @> 和 <@ 分别称为 @ 和 ~。这些名称仍然可用,但已弃用,最终将被删除。请注意,旧名称与核心几何数据类型以前采用的约定正好相反!)

操作符&&、@>和 <@等价于PostgreSQL内置的同名操作符,不同之处在于它们只适用于不包含 NULL 的整数数组,而内置操作符适用于任何数组类型。这一限制使它们在很多情况下比内置操作符更快。

@@和~~操作符用于测试数组是否满足某个查询,该查询表示为专用数据类型query_int 的一个值。一个查询由若干整数值组成,这些值会与数组元素进行检查,并且可通过操作符&(AND)、|(OR)和!(NOT)组合起来。必要时可以使用括号。例如,查询1&(2|3)可匹配包含 1 且还包含 2 或 3 之一的数组。

F.18.2. 索引支持

intarray为&&、@>、<@和@@操作符以及常规数组相等运算提供索引支持。

提供了两个 GiST 索引操作符类:gist__int_ops(默认使用)适用于小型到中型数据集,而gist__intbig_ops使用更大的签名,更适合为大型数据集建立索引(即包含大量不同数组值的列)。实现使用带有内置有损压缩的 RD 树数据结构。

另有一个非默认的 GIN 操作符类gin__int_ops,支持相同的操作符。

作为经验法则,GIN 索引的搜索速度快于 GiST 索引,但构建或更新较慢;因此 GIN 更适合静态数据,而 GiST 更适合经常更新的数据。

F.18.3. 示例

-- a message can be in one or more “sections”
CREATE TABLE message (mid INT PRIMARY KEY, sections INT[], ...);

-- create specialized index
CREATE INDEX message_rdtree_idx ON message USING GIST (sections gist__int_ops);

-- select messages in section 1 OR 2 - OVERLAP operator
SELECT message.mid FROM message WHERE message.sections && '{1,2}';

-- select messages in sections 1 AND 2 - CONTAINS operator
SELECT message.mid FROM message WHERE message.sections @> '{1,2}';

-- the same, using QUERY operator
SELECT message.mid FROM message WHERE message.sections @@ '1&2'::query_int;

F.18.4. 基准测试

源代码目录contrib/intarray/bench包含一个基准测试套件。运行方式如下:

cd .../bench
createdb TEST
psql TEST < ../_int.sql
./create_test.pl | psql TEST
./bench.pl

bench.pl脚本有很多选项,在不带任何参数运行时会显示这些选项。

F.18.5. 作者

所有工作都由 Teodor Sigaev()和 Oleg Bartunov()完成。更多信息请见http://www.sai.msu.su/~megera/postgres/gist/。Andrey Oktyabrski 在添加新函数和新操作方面也做出了很大贡献。

报告文档问题

阅读 上游文档. 反馈更正前请先核对 当前版本手册.