無料スクリプト配布のPHP.TO   PHPの実用的なtips PHPマニュアル MySQLマニュアル Apacheマニュアル PostgreSQLマニュアル マニュアル検索    

F.18. intarray

intarray モジュールはNULLのない整数の配列の操作に便利な関数と演算子を多く提供します。 また、一部の演算子を使用したインデックス検索をサポートします。

配列にNULL要素が一つでも含まれていれば、これらの操作はすべてエラーを発生します。

これらの操作の多くは一次元配列に対してのみ適当なものです。 高次元の入力配列を受け付けますが、データは格納された順の一次元の配列であるかのように扱われます。

F.18.1. intarray の関数および演算子

intarray モジュールで提供される関数を 表F-8 に、演算子を 表F-9 に示します。

表 F-8. 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 から始まり 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-9. 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 で表現される 問い合わせ を満たすかどうかを試験します。 問い合わせ は、おそらく & (論理積), | (論理和), and ! (否定)演算子を組み合わせて使用した、配列要素に対して検査される整数値からなります。 例えば 1&(2|3) という問い合わせは1および、2か3のいずれかを含む配列に一致します。

F.18.2. インデックスサポート

intarray && @> <@ @@ 演算子に関して通常の配列等価性と同様にインデックスサポートを提供します。

2つのGiSTインデックス演算子クラスが提供されます。 gist__int_ops (デフォルトで使用されます)は小中規模要素数のデータセットに適します。 一方、 gist__intbig_ops はより大きな署名を使用しますので、大規模データセット(つまり、異なった配列値を多数持つ列)のインデックスにより適しています。 実装は組込みの非可逆圧縮を持ったRD Treeデータ構造を使用します。

また、同じ演算子をサポートするデフォルトではないGIN演算子クラス gin__int_ops も存在します。

GiSTおよびGINインデックスのどちらを選択するかは、別途説明されるGiSTとGINの相対的な性能特徴に依存します。 まとめると、GINインデックスはGiSTインデックスより高速に検索することができますが、構築または更新は低速です。 このため、GINは静的データに適し、GiSTは頻繁に更新されるデータに適します。

F.18.3. 例

-- 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.18.4. ベンチマーク

ソースディレクトリ以下の contrib/intarray/bench にはベンチマーク試験一式があります。 以下のように実行します。

cd .../bench
createdb TEST
psql TEST < ../_int.sql
./create_test.pl | psql TEST
./bench.pl

bench.pl スクリプトには多くのオプションがあります。 これらは引数を付けずに実行すると表示されます。

F.18.5. 作者

Teodor Sigaev ( )とOleg Bartunov ( )によりすべての作業がなされました。 さらなる情報については http://www.sai.msu.su/~megera/postgres/gist/ を参照してください。 Andrey Oktyabrskiは新しい関数、演算子の追加において素晴らしい作業を行いました。


powered by SEO.CUG.NET