# F.18.内塔雷

F.18.1.内塔雷函数和运算符F.18.2.索引支持F.18.3.实例F.18.4.基准F.18.5.作者

这个内塔雷模块提供了许多有用的函数和运算符,用于操作无空整数数组。还支持使用一些运算符进行索引搜索。

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

其中许多操作仅适用于一维阵列。虽然它们将接受更多维度的输入数组,但数据在存储顺序上被视为线性数组。

该模块被认为是“受信任的”,也就是说,它可以由拥有创造当前数据库的权限。

# F.18.1.内塔雷函数和运算符

内塔雷模块如所示表F.9中的操作员表F.10.

表F.9.内塔雷功能

作用

描述

例子
I计数 ( 整数[] ) → 整数

返回数组中的元素数。

icount(“{1,2,3}”::整数[])3.
分类 ( 整数[], 迪尔 文本 ) → 整数[]

按升序或降序对数组排序。*迪尔*必须是asc描述.

排序('{1,3,2}'::整数[],'desc'){3,2,1}
种类 ( 整数[] ) → 整数[]

sort_asc ( 整数[] ) → 整数[]

按升序排列。

排序(数组[11,77,44]){11,44,77}
sort_desc ( 整数[] ) → 整数[]

按降序排列。

sort_desc(数组[11,77,44]){77,44,11}
独特的 ( 整数[] ) → 整数[]

删除相邻的重复项。

uniq(排序('{1,2,3,2,1}'::integer[])){1,2,3}
编号 ( 整数[], 物品 整数 ) → 整数

返回第一个匹配的数组元素的索引*物品*,如果不匹配,则为 0.

idx(数组[11,22,33,22,11], 22)2
子数组 ( 整数[], 开始 整数, 整数 ) → 整数[]

提取从位置开始的数组部分*开始, 和*元素。

子数组('{1,2,3,2,1}'::integer[], 2, 3){2,3,2}
子数组 ( 整数[], 开始 整数 ) → 整数[]

提取从位置开始的数组部分*开始*.

子数组('{1,2,3,2,1}'::integer[], 2){2,3,2,1}
插图 ( 整数 ) → 整数[]

创建一个单元素数组。

插入(42){42}

表 F.10.数组内运营商

操作员

描述
整数[] && 整数[]布尔值

数组是否重叠(至少有一个共同元素)?
整数[] @> 整数[]布尔值

左数组是否包含右数组?
整数[] <@ 整数[]布尔值

左数组是否包含在右数组中?
`` # 整数[]整数

返回数组中元素的数量。
整数[] # 整数整数

返回与右参数匹配的第一个数组元素的索引,如果不匹配,则返回 0.(如同编号功能。)
整数[] + 整数整数[]

将元素添加到数组的末尾。
整数[] + 整数[]整数[]

连接数组。
整数[] - 整数整数[]

从数组中删除匹配正确参数的条目。
整数[] - 整数[]整数[]

从左数组中删除右数组的元素。
整数[] | 整数整数[]

计算参数的并集。
整数[] | 整数[]整数[]

计算参数的并集。
整数[] & 整数[]整数[]

计算参数的交集。
整数[] @@ 查询整数布尔值

数组是否满足查询?(见下文)
查询整数 ~~ 整数[]布尔值

数组是否满足查询?(换向器@@)

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

@@~~运算符测试数组是否满足询问,表示为特殊数据类型的值查询整数.一种询问由针对数组元素检查的整数值组成,可能使用运算符组合&(和),|(或), 和!(不是)。可以根据需要使用括号。例如,查询1&(2|3)匹配包含1且同时包含2或3的数组。

# F.18.2.索引支持

内塔雷&&,@>@@运算符以及正则数组相等。

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

内部操作要点将整数集近似为整数范围数组。它的可选整数参数努姆兰吉斯确定一个索引键中的最大范围数。的默认值努姆兰吉斯是100.有效值介于1和253之间。使用较大的数组作为GiST索引键会导致更精确的搜索(扫描索引的较小部分和更少的堆页),但代价是索引较大。

大行动要点将整数集近似为位图签名。它的可选整数参数西格伦以字节为单位确定签名长度。默认签名长度为16字节。签名长度的有效值在1到2024字节之间。更长的签名会导致更精确的搜索(扫描更少的索引部分和更少的堆页),但代价是索引更大。

还有一个非默认的GIN操作符类金酒国际行动,它支持这些运算符以及<@.

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

# F.18.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.18.4.基准

源目录contrib/intarray/bench包含一个基准测试套件,可以在已安装的PostgreSQL server上运行。(它还要求DBD::Pg待安装。)要运行:

cd .../contrib/intarray/bench
createdb TEST
psql -c "CREATE EXTENSION intarray" TEST
./create_test.pl | psql TEST
./bench.pl

这个长凳pl脚本有许多选项,在不带任何参数的情况下运行时会显示这些选项。

# F.18.5.作者

所有的工作都是由特奥多尔·西格夫完成的(<[teodor@sigaev.ru](邮寄至:teodor@sigaev.ru)>)还有奥列格·巴图诺夫(<[oleg@sai.msu.su](邮寄至:oleg@sai.msu.su)>).看到了吗http://www.sai.msu.su/~梅格拉/博士后/吉斯特/ (opens new window)了解更多信息。Andrey Oktyabski在添加新功能和操作方面做了大量工作。