intarrayモジュールは整数の一次元配列の操作に便利な関数と演算子を多く提供します。 また、一部の演算子を使用したインデックス検索をサポートします。
表 F-7. intarray関数
関数 | 戻り値の型 | 説明 | 例 | 結果 |
---|---|---|---|---|
icount(int[]) | int | 配列内の要素数 | icount('{1,2,3}'::int[]) | 3 |
sort(int[], text dir) | int[] | 配列のソート。dirはascまたはdescのいずれかでなければなりません。 | sort('{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から始まりelements長の部分配列 | 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-8. intarray演算子
演算子 | 戻り値 | 説明 |
---|---|---|
int[] && int[] | boolean | 重なり。配列間で少なくとも1つの共通要素がある場合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より前では、含有演算子@>および<@はそれぞれ@および~という名前でした。 この名前もまだ利用できますが、廃止予定で最終的にはなくなります。 古い名前がコアの幾何データ型が従う規約とは反対であることに注意してください。
@@および~~演算子は、配列が特化したデータ型query_intで表現される問い合わせを満たすかどうかを試験します。 問い合わせは、おそらく&(論理積), | (論理和), and ! (否定)演算子を組み合わせて使用した、配列要素に対して検査される整数値からなります。 例えば1&(2|3)という問い合わせは1および、2か3のいずれかを含む配列に一致します。
intarrayは&&、@>、<@、@@に関して通常の配列等価性と同様にインデックスサポートを提供します。 実装は組込みの損失がある比較を持ったRD Treeデータ構造を使用します。
2つのGiSTインデックス演算子クラスが提供されます。 gist__int_ops(デフォルトで使用されます)は小中規模要素数の配列に適します。 gist__intbig_opsはより大きな署名を使用しますので、大規模配列のインデックスにより適しています。
また、デフォルトではないGIN演算子クラスgin__int_opsも存在します。
GiSTおよびGINインデックスのどちらを選択するかは、別途説明されるGiSTとGINの相対的な性能特徴に依存します。 まとめると、GINインデックスはGiSTインデックスより高速に検索することができますが、構築または更新は低速です。 このため、GINは静的データに適し、GいSTは頻繁に更新されるデータに適します。
-- 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;
ソースディレクトリ以下のcontrib/intarray/benchにはベンチマーク試験一式があります。 以下のように実行します。
cd .../bench createdb TEST psql TEST < ../_int.sql ./create_test.pl | psql TEST ./bench.pl
bench.plスクリプトには多くのオプションがあります。 これらは引数を付けずに実行すると表示されます。
Teodor Sigaev (<teodor@stack.net>
)とOleg Bartunov (<oleg@sai.msu.su>
)によりすべての作業がなされました。
さらなる情報についてはhttp://www.sai.msu.su/~megera/postgres/gistを参照してください。
Andrey Oktyabrskiは新しい関数、演算子の追加において素晴らしい作業を行いました。