intarray
モジュールはNULLのない整数の配列の操作に便利な関数と演算子を多く提供します。
また、一部の演算子を使用したインデックス検索をサポートします。
配列にNULL要素が一つでも含まれていれば、これらの操作はすべてエラーを発生します。
これらの操作の多くは一次元配列に対してのみ適当なものです。 高次元の入力配列を受け付けますが、データは格納された順の一次元の配列であるかのように扱われます。
intarray
の関数および演算子
intarray
モジュールで提供される関数を表 F.9に、演算子を表 F.10に示します。
表F.9 intarray
関数
表F.10 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以前では、包含演算子@>と
<@
はそれぞれ@
と~
と呼ばれていました。
これらの名前はまだ利用できますが、廃止予定であり、最終的にはなくなります。
古い名前はコアの幾何データ型が以前従っていた規約とは反対であることに注意してください。)
演算子&&
、@>
と<@
は、これらはNULLを含まない整数配列のみで動作し、組み込み演算子はどの配列型に対しても動作する点を除き、同じ名前のPostgreSQLの組み込み演算子とそれぞれほぼ等価です。
この制限により、多くの場合、組み込み演算子より高速です。
@@
および~~
演算子は、配列が特化したデータ型query_int
で表現される問い合わせを満たすかどうかを試験します。
問い合わせは、おそらく&
(論理積)、|
(論理和)、!
(否定)演算子を組み合わせて使用した、配列要素に対して検査される整数値からなります。
例えば1&(2|3)
という問い合わせは1および、2か3のいずれかを含む配列に一致します。
intarray
は&&
、@>
、<@
、@@
演算子に関して通常の配列等価性と同様にインデックスサポートを提供します。
2つのGiSTインデックス演算子クラスが提供されます。
gist__int_ops
(デフォルトで使用されます)は小中規模要素数のデータセットに適します。
一方、gist__intbig_ops
はより大きな署名を使用しますので、大規模データセット(つまり、異なった配列値を多数持つ列)のインデックスにより適しています。
実装は組み込みの非可逆圧縮を持ったRD-treeデータ構造を使用します。
また、同じ演算子をサポートするデフォルトではないGIN演算子クラスgin__int_ops
も存在します。
GiSTおよびGINインデックスのどちらを選択するかは、別途説明されるGiSTとGINの相対的な性能特徴に依存します。
-- メッセージ(message)は1つ以上の「節(section)」の中にある
CREATE TABLE message (mid INT PRIMARY KEY, sections INT[], ...);
-- 特化したインデックスを作成
CREATE INDEX message_rdtree_idx ON message USING GIST (sections gist__int_ops);
-- 節1 OR 2のメッセージを選択 - OVERLAP演算子
SELECT message.mid FROM message WHERE message.sections && '{1,2}';
-- 節1 AND 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;
ソースディレクトリ以下の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
スクリプトには多くのオプションがあります。
これらは引数を付けずに実行すると表示されます。
Teodor Sigaev (<teodor@sigaev.ru>
)とOleg Bartunov (<oleg@sai.msu.su>
)によりすべての作業がなされました。
さらなる情報についてはhttp://www.sai.msu.su/~megera/postgres/gist/を参照してください。
Andrey Oktyabrskiは新しい関数、演算子の追加において素晴らしい作業を行いました。