On this page
F.18. intarray
intarray
模块提供了许多有用的函数和运算符,用于处理无空整数数组。还支持使用某些运算符进行索引搜索。
如果提供的数组包含任何 NULL 元素,则所有这些操作都将引发错误。
其中许多操作仅对一维数组有意义。尽管它们将接受更大尺寸的 Importing 数组,但将数据视为按存储 Sequences 是线性数组。
F.18.1. 整数数组函数和运算符
intarray
模块提供的功能显示在Table F.9中,运算符显示在Table F.10中。
表 F.9.intarray
功能
表 F.10.intarray
个运算符
Operator | Returns | Description |
---|---|---|
int[] && int[] |
boolean |
重叠— true 如果数组具有至少一个公共元素 |
int[] @> int[] |
boolean |
包含— true (如果左数组包含右数组) |
int[] <@ int[] |
boolean |
包含— true 如果右侧数组中包含左侧数组 |
# int[] |
int |
数组中的元素数 |
int[] # int |
int |
索引(与idx 函数相同) |
int[] + int |
int[] |
将元素推送到数组(将其添加到数组的末尾) |
int[] + int[] |
int[] |
数组串联(将右侧数组添加到左侧数组的末尾) |
int[] - int |
int[] |
从数组中删除匹配右参数的条目 |
int[] - int[] |
int[] |
从左边删除右边数组的元素 |
int[] | int |
int[] |
论点联合 |
int[] | int[] |
int[] |
数组联合 |
int[] & int[] |
int[] |
数组的交集 |
int[] @@ query_int |
boolean |
true 数组是否满足查询条件(请参见下文) |
query_int ~~ int[] |
boolean |
true 如果数组满足查询要求(@@ 的换向器) |
(在 PostgreSQL 8.2 之前,容器运算符@>
和<@
分别称为@
和~
.这些名称仍然可用,但已过时,最终将被淘汰.请注意,旧名称与惯例相反,以前是约定,之后是核心几何数据类型!)
运算符&&
,@>
和<@
等效于 PostgreSQL 的同名内置运算符,不同之处在于它们仅适用于不包含 null 的整数数组,而内置运算符适用于任何数组类型。在许多情况下,此限制使它们比内置运算符更快。
@@
和~~
运算符测试数组是否满足* query *,该查询表示为专用数据类型query_int
的值。 * query *由针对数组元素检查的整数值组成,可能使用运算符&
(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
支持相同的运算符。
GiST 和 GIN 索引之间的选择取决于 GiST 和 GIN 的相对性能 Feature,这将在其他地方讨论。
F.18.3. Example
-- 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. Benchmark
源目录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.18.5. Authors
所有工作都是由 Teodor Sigaev(<teodor@sigaev.ru>
)和 Oleg Bartunov(<oleg@sai.msu.su>
)完成的。有关其他信息,请参见http://www.sai.msu.su/~megera/postgres/gist/。 Andrey Oktyabrski 在添加新功能和操作方面做得很棒。