開発中のPostgreSQL 8.2は,新たな機能をコードに追加することを禁止する,いわゆる「フィーチャーフリーズ」が宣言され,ベータ・テストの開始が間近になった。今回はPostgreSQL 8.2で追加される予定の機能のうち,GINと呼ばれる新しいインデックスタイプ,COPYとINSERTの機能追加を紹介する。
なお,ここで紹介する機能はあくまで本稿執筆時点のソースコードに基づくものであり,PostgreSQL 8.2の正式リリース時には変更されている可能性があることをお断りしておく。
GIN
GINは,"Generalized Inverted Index"の略で,日本語では「汎用転置インデックス」となる。GINはBtree同様,PostgreSQLのインデックスタイプの一つである。GINを使うと,文章中に出現する単語毎にインデックスを作成し,ある単語が含まれるドキュメントを高速に検索するようなことが可能になる。また,GINはテキスト検索だけでなく,様々なデータ型に対して転置インデックスを作成できる。
GINが「汎用」と言われる理由は,はインデックスで扱うことのできる演算子を自由に定義できる点にある。Btreeでは等しい,大きい,小さいなどの演算子を含む問い合わせのみを高速化できるが,GINでは高速化可能な演算子はユーザが自由に定義できる。
GINはTeodor Sigaev氏やOleg Bartunov氏などのロシア人の開発者によって開発されている。彼らは,GiSTの開発なども行っている。ちなみにGIN の発音はお酒の「ジン」と同じで,このあたりは酒に強いロシア人のユーモアなのであろう(実際GINをPostgreSQLの開発者向けメーリングリストで最初に提案したときにそのような話があった)。
GINによる整数配列の検索
GINではデフォルトで,整数配列とテキスト配列を扱ういくつかの演算子が提供されている。まずは整数配列を見ていこう。
次のようなテーブルを考える。
CREATE TABLE t1(i INTEGER[]); |
t1は整数配列の列だけを持つ単純なテーブルである。これにいくつかデータを登録する。
INSERT INTO t1 VALUES(ARRAY[1,2,3]); INSERT INTO t1 VALUES(ARRAY[4,5,6]); INSERT INTO t1 VALUES(ARRAY[7,8,9]); |
この中から,配列要素として5を含む行を検索してみよう。とりあえず以下のような検索方法が考えられる。
test=# SELECT * FROM t1 WHERE 5 =ANY(i); i --------- {4,5,6} (1 row) |
たしかにこれはこれで目的は達成できるが,問題はこのような検索にはインデックスは使えない,ということだ。これではテーブルが大きくなったときに検索が遅くなってしまう。