F.20. intarray — 操作整数数组#
intarray
模块提供了一些有用的函数和运算符,用于处理不含 NULL 的整数数组。还支持使用某些运算符进行索引搜索。
如果提供的数组包含任何 NULL 元素,所有这些操作都会引发错误。
其中许多操作仅对一维数组有意义。虽然它们会接受更多维度的输入数组,但数据会被视为按存储顺序排列的线性数组。
此模块被认为是“受信任的”,也就是说,它可以由对当前数据库具有CREATE
权限的非超级用户安装。
F.20.1.intarray
函数和运算符#
intarray
模块提供的函数显示在表 F.9中,运算符显示在表 F.10中。
表 F.9.intarray
函数
表 F.10.intarray
运算符
运算符 说明 |
---|
数组是否重叠(至少有一个元素相同)? |
左数组是否包含右数组? |
左数组是否包含在右数组中? |
返回数组中的元素数量。 |
返回与右参数匹配的第一个数组元素的索引,如果没有匹配项,则返回 0。(与 |
将元素添加到数组末尾。 |
连接数组。 |
从数组中删除与右参数匹配的条目。 |
从左数组中删除右数组的元素。 |
计算参数的并集。 |
计算参数的并集。 |
计算参数的交集。 |
数组是否满足查询?(见下文) |
数组是否满足查询?( |
运算符&&
、@>
和<@
等效于PostgreSQL的同名内置运算符,不同之处在于它们仅适用于不包含空值的整数数组,而内置运算符适用于任何数组类型。在许多情况下,此限制使它们比内置运算符更快。
@@
和~~
运算符测试数组是否满足查询,该查询表示为专用数据类型query_int
的值。查询由针对数组元素检查的整数值组成,可能使用运算符&
(AND)、|
(OR)和!
(NOT)组合。根据需要可以使用括号。例如,查询1&(2|3)
匹配包含 1 且还包含 2 或 3 的数组。
F.20.2. 索引支持#
intarray
为&&
、@>
和@@
运算符以及常规数组相等性提供索引支持。
提供了两个参数化的 GiST 索引运算符类:gist__int_ops
(默认使用)适用于中小型数据集,而gist__intbig_ops
使用更大的签名,更适合于索引大型数据集(即包含大量不同数组值列)。该实现使用内置有损压缩的 RD 树数据结构。
gist__int_ops
将整数集近似为整数范围数组。其可选整数参数numranges
确定一个索引键中的最大范围数。默认numranges
值为 100。有效值介于 1 和 253 之间。将较大的数组用作 GiST 索引键会导致更精确的搜索(扫描更小的索引部分和更少的堆页),但代价是索引更大。
gist__intbig_ops
将整数集近似为位图签名。其可选整数参数siglen
确定签名长度(以字节为单位)。默认签名长度为 16 字节。有效签名长度介于 1 和 2024 字节之间。更长的签名会导致更精确的搜索(扫描更小的索引部分和更少的堆页),但代价是索引更大。
还有一个非默认 GIN 运算符类gin__int_ops
,它支持这些运算符以及<@
。
在 GiST 和 GIN 索引之间进行选择取决于 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 (<[[email protected]](/cdn-cgi/l/email-protection#e6928389828994a6958f81878390c89493)>
) 和 Oleg Bartunov (<[[email protected]](/cdn-cgi/l/email-protection#2f40434a486f5c4e4601425c5a015c5a)>
) 完成。有关其他信息,请参阅http://www.sai.msu.su/~megera/postgres/gist/。Andrey Oktyabrski 在添加新函数和操作方面做了大量工作。