intarray 模块提供了一系列用于操作非空整数数组的有用函数和运算符。它还支持使用其中一些运算符进行索引搜索。
如果提供的数组包含任何 NULL 元素,所有这些操作都将引发错误。
许多操作对于一维数组才有意义。尽管它们可以接受多维输入数组,但数据在存储时被视为线性数组。
此模块被认为是“受信任的”,这意味着非超级用户也可以在其拥有的数据库上安装它,前提是他们具有 CREATE 权限。
intarray 函数和运算符 #intarray 模块提供的函数显示在表 F.8中,运算符显示在表 F.9中。
表 F.8. intarray 函数
表 F.9. intarray 运算符
|
运算符 描述 |
|---|
|
数组是否重叠(有至少一个元素相同)? |
|
左侧数组是否包含右侧数组? |
|
左侧数组是否包含在右侧数组中? |
|
返回数组中元素的数量。 |
|
返回第一个匹配右侧参数的数组元素的索引,如果未找到则返回 0。(与 |
|
将元素添加到数组末尾。 |
|
连接数组。 |
|
从数组中移除匹配右侧参数的条目。 |
|
从左侧数组中移除右侧数组的元素。 |
|
计算参数的并集。 |
|
计算参数的并集。 |
|
计算参数的交集。 |
|
数组是否满足查询?(见下文) |
|
数组是否满足查询?( |
运算符 &&、@> 和 <@ 等同于 PostgreSQL 内置的同名运算符,但它们仅适用于不包含 NULL 的整数数组,而内置运算符适用于任何数组类型。在许多情况下,这种限制使它们比内置运算符更快。
@@ 和 ~~ 运算符测试一个数组是否满足一个由特殊数据类型 query_int 表示的查询。一个查询由整数值组成,这些值将与数组的元素进行比较,并可能使用运算符 & (AND)、| (OR) 和 ! (NOT) 进行组合。可以根据需要使用括号。例如,查询 1&(2|3) 匹配包含 1 且同时包含 2 或 3 的数组。
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 索引之间的选择取决于 GiST 和 GIN 的相对性能特点,这些特点将在其他地方讨论。
-- 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;
源目录 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 脚本有许多选项,在不带任何参数运行时会显示这些选项。
所有工作由 Teodor Sigaev(<teodor@sigaev.ru>)和 Oleg Bartunov(<oleg@sai.msu.su>)完成。更多信息请参见 http://www.sai.msu.su/~megera/postgres/gist/。Andrey Oktyabrski 在添加新函数和操作方面做了大量工作。