F.20. intarray #
intarray 模块提供了一些有用的函数和操作符,用于操作不含
NULL 的整数数组。它还支持使用其中某些操作符进行索引搜索。
如果所提供的数组中包含任何 NULL 元素,所有这些操作都会抛出错误。
这些操作中有许多只对一维数组才有意义。尽管它们也接受更高维度的输入数组,但数据会被视为按存储顺序排列的线性数组。
该模块被认为是“受信任的”,也就是说,它可以由在当前数据库上具有 CREATE 权限的非超级用户安装。
F.20.1. intarray 函数和操作符 #
intarray 模块提供的函数列在表 F.9 中,操作符列在表 F.10 中。
表 F.9. intarray 函数
表 F.10. intarray 操作符
操作符 描述 |
|---|
数组是否重叠(至少有一个共同元素)? |
左数组是否包含右数组? |
左数组是否包含在右数组中? |
返回数组中的元素个数。 |
返回第一个与右操作数匹配的数组元素的索引,若无匹配则返回 0。(与 |
将元素添加到数组末尾。 |
将这些数组连接起来。 |
从数组中移除与右操作数匹配的项。 |
从左数组中移除右数组中的元素。 |
计算参数的并集。 |
计算参数的并集。 |
计算参数的交集。 |
数组是否满足查询?(见下文) |
数组是否满足查询?( |
操作符&&、@> 和
<@等价于 PostgreSQL 内置的同名操作符,不同之处在于它们只适用于不包含 NULL 的整数数组,而内置操作符适用于任何数组类型。这一限制使它们在很多情况下比内置操作符更快。
@@和~~操作符用于测试数组是否满足某个查询,该查询表示为专用数据类型 query_int
的一个值。一个查询由若干整数值组成,这些值会与数组元素进行比对,并且可通过操作符&(AND)、|(OR)和!(NOT)组合起来。必要时可以使用括号。例如,查询 1&(2|3) 可匹配包含 1
且还包含 2 或 3 之一的数组。
F.20.2. 索引支持 #
intarray 为&&、@> 和@@操作符以及常规的数组相等运算提供索引支持。
提供了两个带参数的 GiST 索引操作符类:默认使用的
gist__int_ops 适用于小到中等规模的数据集,而
gist__intbig_ops 使用较大的签名,更适合为大型数据集建立索引(即列中包含大量不同数组值的数据集)。该实现使用
RD-tree 数据结构,并带有内置的有损压缩。
gist__int_ops 将整数集近似表示为整数范围数组。其可选整数参数 numranges 决定单个索引键中的最大范围数。numranges 的默认值是 100,有效值在 1 到 253 之间。使用更大的数组作为 GiST 索引键会带来更精确的搜索(扫描索引的较小部分和较少的堆页),代价是索引会更大。
gist__intbig_ops 将整数集近似表示为位图签名。其可选整数参数 siglen 决定签名长度(以字节为单位)。默认签名长度为 16 字节,签名长度的有效值在 1 到 2024 字节之间。更长的签名会带来更精确的搜索(扫描索引的较小部分和较少的堆页),代价是索引会更大。
另有一个非默认的 GIN 操作符类 gin__int_ops,它除了支持这些操作符外,还支持<@。
在 GiST 和 GIN 索引之间如何选择,取决于二者的相对性能特征,相关讨论见其他部分。
F.20.3. 示例 #
-- a message can be in one or more “sections”
CREATE TABLE message (mid INT PRIMARY KEY, sections INT[], ...);
-- create specialized index with signature length of 32 bytes
CREATE INDEX message_rdtree_idx ON message USING GIST (sections gist__intbig_ops (siglen = 32));
-- 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.20.4. 基准测试 #
源代码目录 contrib/intarray/bench 包含一个基准测试套件,可以针对一个已安装的 PostgreSQL 服务器运行。(还要求已安装 DBD::Pg。)运行方式如下:
cd .../contrib/intarray/bench createdb TEST psql -c "CREATE EXTENSION intarray" TEST ./create_test.pl | psql TEST ./bench.pl
bench.pl 脚本有很多选项,在不带任何参数运行时会显示这些选项。
F.20.5. 作者 #
所有工作都由 Teodor Sigaev(<teodor@sigaev.ru>)和
Oleg Bartunov(<oleg@sai.msu.su>)完成。更多信息请见 http://www.sai.msu.su/~megera/postgres/gist/。Andrey Oktyabrski 在添加新函数和操作方面也做出了很大贡献。
报告文档问题
阅读 上游文档. 通过 PostgreSQL 文档反馈表单.