F.19. intarray

intarray模块提供了许多有用的函数和运算符,用于处理无空整数数组。还支持使用某些运算符进行索引搜索。

如果提供的数组包含任何 NULL 元素,则所有这些操作都将引发错误。

其中许多操作仅对一维数组有意义。尽管它们将接受更大尺寸的 Importing 数组,但将数据视为按存储 Sequences 是线性数组。

F.19.1. 整数数组函数和运算符

intarray模块提供的功能显示在Table F.10中,运算符显示在Table F.11中。

表 F.10.intarray功能

FunctionReturn TypeDescriptionExampleResult
icount(int[]) int数组中的元素数icount('{1,2,3}'::int[])3
sort(int[], text dir) int[]排序数组— * dir *必须为ascdescsort('{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个运算符

OperatorReturnsDescription
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_intbooleantrue数组是否满足查询条件(请参见下文)
query_int ~~ int[]booleantrue如果数组满足查询要求(@@的换向器)

(在 PostgreSQL 8.2 之前,容器运算符@><@分别称为@~.这些名称仍然可用,但已过时,最终将被淘汰.请注意,旧名称与惯例相反,以前是约定,之后是核心几何数据类型!)

运算符&&@><@等效于 PostgreSQL 的同名内置运算符,不同之处在于它们仅适用于不包含 null 的整数数组,而内置运算符适用于任何数组类型。在许多情况下,此限制使它们比内置运算符更快。

@@~~运算符测试数组是否满足* query *,该查询表示为专用数据类型query_int的值。 * query *由针对数组元素检查的整数值组成,可能使用运算符&(AND),|(OR)和!(NOT)进行组合。可以根据需要使用括号。例如,查询1&(2|3)匹配包含 1 且还包含 2 或 3 的数组。

F.19.2. 索引支持

intarray&&@><@@@运算符提供索引支持,以及常规数组相等性。

提供了两种 GiST 索引运算符类:gist__int_ops(默认情况下使用)适用于中小型数据集,而gist__intbig_ops使用较大的签名,更适用于索引大型数据集(即,包含大量数据集的列)不同的数组值)。该实现使用带有内置有损压缩的 RD 树数据结构。

还有一个非默认的 GIN 运算符类别gin__int_ops支持相同的运算符。

GiST 和 GIN 索引之间的选择取决于 GiST 和 GIN 的相对性能 Feature,这将在其他地方讨论。

F.19.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.19.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.19.5. Authors

所有工作都是由 Teodor Sigaev(<[email protected]>)和 Oleg Bartunov(<[email protected]>)完成的。有关其他信息,请参见http://www.sai.msu.su/~megera/postgres/gist/。 Andrey Oktyabrski 在添加新功能和操作方面做得很棒。