PostgreSQL intarray

2021-09-16 15:45 更新
F.18.1. intarray 函數(shù)和操作符
F.18.2. 索引支持
F.18.3. 例子
F.18.4. 測(cè)試基準(zhǔn)

intarray模塊提供了一些有用的函數(shù)和操作符來操縱不含空值的整數(shù)數(shù)組。也提供了對(duì)使用某些操作符的索引搜索的支持。

如果一個(gè)提供的數(shù)組中包含任何 NULL 元素,所有這些操作都將拋出一個(gè)錯(cuò)誤。

很多這些操作只對(duì)一維數(shù)組有意義。盡管它們將接受更多維數(shù)的數(shù)組輸入,數(shù)據(jù)將被當(dāng)作一個(gè)按照存儲(chǔ)順序排列的線性數(shù)組對(duì)待。

該模塊被認(rèn)為是trusted,也就是說,它可以由對(duì)當(dāng)前數(shù)據(jù)庫(kù)具有CREATE權(quán)限的非超級(jí)用戶安裝。

F.18.1. intarray 函數(shù)和操作符

intarray模塊提供的函數(shù)被列在表 F.9中,操作符被列在表 F.10中。

表 F.9. intarray 函數(shù)

函數(shù)

描述

例子

icount ( integer[] ) → integer

返回?cái)?shù)組中元素的數(shù)量

icount('{1,2,3}'::integer[])3

sort ( integer[], dir text ) → integer[]

按升序或降序?qū)?shù)組進(jìn)行排序。 dir必須是ascdesc。

sort('{1,3,2}'::integer[], 'desc'){3,2,1}

sort ( integer[] ) → integer[]

sort_asc ( integer[] ) → integer[]

以升序排序

sort(array[11,77,44]){11,44,77}

sort_desc ( integer[] ) → integer[]

以降序排序

sort_desc(array[11,77,44]){77,44,11}

uniq ( integer[] ) → integer[]

移除臨近的重復(fù)

uniq(sort('{1,2,3,2,1}'::integer[])){1,2,3}

idx ( integer[], item integer ) → integer

返回匹配item的第一個(gè)元素的索引(如果沒有為 0)

idx(array[11,22,33,22,11], 22)2

subarray ( integer[], start integer, len integer ) → integer[]

提取從位置start開始的由len個(gè)元素組成的元組部分

subarray('{1,2,3,2,1}'::integer[], 2, 3){2,3,2}

subarray ( integer[], start integer ) → integer[]

提取從位置start開始的元組部分

subarray('{1,2,3,2,1}'::integer[], 2){2,3,2,1}

intset ( integer ) → integer[]

創(chuàng)建單一元素?cái)?shù)組

intset(42){42}


表 F.10. intarray 操作符

操作符

描述

integer[] && integer[]boolean

數(shù)組是否重疊(至少有一個(gè)共同元素)?

integer[] @> integer[]boolean

左數(shù)組是否包含右數(shù)組?

integer[] <@ integer[]boolean

左數(shù)組是否包含在右數(shù)組中?

# integer[]integer

返回?cái)?shù)組中元素的數(shù)目

integer[] # integerinteger

返回與正確參數(shù)匹配的第一個(gè)數(shù)組元素的索引,如果不匹配則返回 0。 (與idx函數(shù)相同。)

integer[] + integerinteger[]

將元素添加到數(shù)組末尾。

integer[] + integer[]integer[]

連接數(shù)組。

integer[] - integerinteger[]

從數(shù)組中移除匹配右參數(shù)的項(xiàng)

integer[] - integer[]integer[]

從左數(shù)組中移除右數(shù)組的元素

integer[] | integerinteger[]

計(jì)算參數(shù)的并集

integer[] | integer[]integer[]

計(jì)算參數(shù)的并集

integer[] & integer[]integer[]

計(jì)算參數(shù)的交集。

integer[] @@ query_intboolean

數(shù)組是否滿足查詢?(見下文)

query_int ~~ integer[]boolean

數(shù)組是否滿足查詢?(@@的交換子)


(在 PostgreSQL 8.2 之前,包含操作符@><@分別被稱為@~。這些名稱仍然有效,但是已被棄用并且將最終被移除。注意舊名稱與核心幾何數(shù)據(jù)類型之前所遵循的習(xí)慣相反?。?/p>

操作符&&、@><@等效于PostgreSQL的內(nèi)建同名操作符,不過它們只能在不含空值的整數(shù)數(shù)組上工作,而內(nèi)建的操作符可以對(duì)任何數(shù)組類型工作。這種限制使它們?cè)诤芏嗲闆r下比內(nèi)建操作符更快。

@@~~操作符測(cè)試一個(gè)數(shù)組是否滿足一個(gè)query,它被表示成一種特殊數(shù)據(jù)類型query_int的一個(gè)值。一個(gè)由整數(shù)值組成的查詢會(huì)被針對(duì)數(shù)組的元素檢查,可能會(huì)組合使用操作符&(AND)、 |(OR)以及!(NOT)。根據(jù)需要可以使用圓括號(hào)。例如,查詢1&(2|3)匹配包含 1 并且還包括 2 或 3 的數(shù)組。

F.18.2. 索引支持

intarray提供對(duì)于&&、@><@@@操作符以及常規(guī)數(shù)組相等的索引支持。

提供了兩種參數(shù)化的 GiST 索引操作符類:gist__int_ops(被默認(rèn)使用)適合于中小尺寸的數(shù)據(jù)集,而gist__intbig_ops使用一種更大的簽名并且更適合于索引大型數(shù)據(jù)集(即,包含大量可區(qū)分?jǐn)?shù)組值的列)。該實(shí)現(xiàn)使用了一種帶有內(nèi)建有損壓縮的 RD 樹結(jié)構(gòu)。

gist__int_ops將整數(shù)集近似為整數(shù)范圍數(shù)組。 它的可選整數(shù)參數(shù)numranges決定了一個(gè)索引鍵中的最大范圍數(shù)。 numranges的默認(rèn)值是 100。有效值在 1 到 253 之間。 使用更大的數(shù)組作為 GiST 索引鍵會(huì)導(dǎo)致更精確的搜索(掃描更小的索引部分和更少的堆頁面), 以更大的索引為代價(jià)。

gist__intbig_ops將整數(shù)集近似為位圖簽名。 它的可選整數(shù)參數(shù)siglen確定簽名長(zhǎng)度(以字節(jié)為單位)。 默認(rèn)簽名長(zhǎng)度為 16 字節(jié)。簽名長(zhǎng)度的有效值介于 1 到 2024 字節(jié)之間。 更長(zhǎng)的簽名導(dǎo)致更精確的搜索(掃描索引的一小部分和更少的堆頁面),但代價(jià)是更大的索引。

也有一種非默認(rèn)的 GIN 操作符類gin__int_ops支持相同的操作符。

在 GiST 和 GIN 索引之間的選擇取決于 GiST 和 GIN 的相對(duì)性能特點(diǎn), 這將在其他地方討論。

F.18.3. 例子

-- 一個(gè)消息可以在一個(gè)或多個(gè)小節(jié)中
CREATE TABLE message (mid INT PRIMARY KEY, sections INT[], ...);

-- 創(chuàng)建簽名長(zhǎng)度為 32 字節(jié)的專用索引
CREATE INDEX message_rdtree_idx ON message USING GIST (sections gist__int_ops(siglen=32));

-- 選擇小節(jié) 1 或 2 中的消息 - OVERLAP 操作符
SELECT message.mid FROM message WHERE message.sections && '{1,2}';

-- 選擇小節(jié) 1 和 2 中的消息 - CONTAINS 操作符
SELECT message.mid FROM message WHERE message.sections @> '{1,2}';

-- 相同,使用 QUERY 操作符
SELECT message.mid FROM message WHERE message.sections @@ '1&2'::query_int;

F.18.4. 測(cè)試基準(zhǔn)

源代碼目錄contrib/intarray/bench包含有一個(gè)基準(zhǔn)測(cè)試套件,可以針對(duì) 一個(gè)安裝好的PostgreSQL服務(wù)器運(yùn)行這個(gè)套件(還要求安裝 DBD::Pg)。要運(yùn)行測(cè)試基準(zhǔn):

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

bench.pl腳本有多個(gè)選項(xiàng),當(dāng)它不使用任何參數(shù)運(yùn)行時(shí)會(huì)顯示這些選項(xiàng)。

 

以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)