PostgreSQL 9.4 GINインデックスの評価、JSONBデータ型の使い方PostgreSQLガイダンス(1)(1/2 ページ)

PostgreSQL 9.4で注目が集まるGINインデックスの性能を検証、バイナリJSONデータ型の使い方も紹介する。

» 2014年09月04日 19時21分 公開
[高塚遥SRA OSS, Inc.]

PostgreSQL 9.4は実務ニーズに即した機能追加が豊富

 PostgreSQLは、その名の通りSQL言語で問い合わせをするリレーショナルデータベースマネジメントシステム(RDBMS)です。近年、NoSQLと総称されるスケールアウト拡張の容易さに強みのあるキーバリューストア型のデータベースが注目されていますが、汎用性、データ整合性、データ保全性、蓄積されたデータ設計技法との親和性、などの強みから、システム中核要素としてのリレーショナルデータベースの地位は揺らぎそうにありません。

 PostgreSQLは長い歴史を持つオープンソースソフトウェアです。組織立ったコミュニティによって開発とメンテナンスが活発に継続されており、年に数度のバグ修正リリースの他、年に一度のペースで――ここ数年でいえば毎年9月ごろに新機能を加えた新バージョン系列がリリースされます。

 本稿では2014年秋にも正式リリースされるであろうPostgreSQLの新バージョン 9.4の紹介をしていきますが、本稿執筆時点ではリリース前であることから、PostgreSQL 9.4 beta2の評価・検証結果を基にしています。今後の正式リリース版までには、細かなバグフィックスなどが行われる見込みですが、およその機能については本稿にあるbeta2での検証内容を参考にできると考えてよいでしょう。

 また、ほとんどの解説は実行プラットフォームを選ばないように書かれていますが、拡張モジュールをコンパイルしてインストールする部分については一般的なLinux/UNIX系の環境を前提にしています。

 PostgreSQL 9.4における機能拡張は、SQL構文の追加サポート、レプリケーション機能の強化、運用管理操作の改善、性能改善など多岐にわたっていますが、全体的な印象としては、前回の9.3リリースの内容と比べるといくぶん地味な印象です。

 9.3で実装され、話題になった「マテリアライズドビュー機能」のような派手な項目がありません。

 一方で「SQL から設定ファイルを変更する」「マテリアライズドビューのリフレッシュでのロック待ちを軽減」など、実務ニーズに即した機能追加が多くあります。また、PostgreSQL機能拡張のためのAPIが追加されています。これにより今後の拡張モジュールや周辺ソフトウェアの開発の幅が広がることが期待できます。

 PostgreSQL 9.4の拡張・改善内容の中で、目玉というべきはGINインデックスの性能改善JSONデータ型に関連した機能強化です。実際に利用する際には、この二つを組み合わせて使用することで、非常に強力なソリューションを提供します。連載第1回に当たる本記事では、これらについて紹介していきます。

PostgreSQL最新版の情報源

PostgreSQL最新版の情報はPostgreSQL開発プロジェクトのWebサイトを参照ください。

PostgreSQLそのもののインストールなどの解説

使えば分かるPostgreSQL運用&チューニング(1):PostgreSQL導入から接続まで

PostgreSQLのインストールについての参考記事はこちら。バージョン8.3で解説していますが、およその操作に変更はありません。



GINインデックスとは?

 GINはGeneralized Inverted Index(汎用転置インデックス)の略です。名称からすると「Index」の部分が重複するのですが、インデックス種類名がGINであるため、本稿では「GINインデックス」と記載していきます。

 GINインデックスは、PostgreSQL 8.2から導入されたインデックスの種類です。一つの値の中に複数の要素を持つようなデータ型に対して、「この要素を含むもの」を問い合わせるときに活用できます。代表的な用途としてはテキスト全文検索などが挙げられます。

 GINインデックスのような機能は、PostgreSQL以外のリレーショナルデータベースソフトでは、あまり見かけることがありません(Oracle Databaseで実装している全文検索機能「Oracle Text」の場合はテーブル仲介をして、転置インデックスを実現していますので実装が異なります)。PostgreSQL 9.4では、このGINインデックスのパフォーマンスが向上しています。

 まずはGINインデックス自体について紹介していきましょう。ここでは配列データ型を使った例を示します。

 以下のような「記事」を表すテーブル「t_article」を作成し(1行目)、一つの記事に対して複数のタグが付けられるようにテキスト配列の「tagsカラム」を持つものとします(2行目)。ここにGINインデックスを作成してみましょう(3行目)。

db1=# CREATE TABLE t_article (id int PRIMARY KEY,
       tags text[], document text, author text, dt timestamp);
db1=# CREATE INDEX idx_tags ON t_article USING gin (tags);

 そうすると、以下のような指定のタグ「PostgreSQL」「DB」を含む記事を取り出す問い合わせに対して、GINインデックスが効いて、高速な検索が可能となります。「@>」は、右辺の配列要素全てが左辺の配列に含まれるという意味の演算子です。

 db1=# SELECT id FROM t_article WHERE tags @> ARRAY['PostgreSQL', 'DB'];

 実際にSELECTを実行して試したい場合には、以下のようにダミーデータを登録してから、上記の操作を試してみてください。実行するサーバー環境にもよりますが、GINインデックスがない場合に比べて10倍程度の速度で応答するはずです。

db1=# INSERT INTO t_article SELECT i, ARRAY[]::text[], repeat('dummy', 1002:),
        'dummy', now() FROM generate_series(1, 10000) as i;
db1=# UPDATE t_article SET tags = tags || ARRAY['PostgreSQL']
        WHERE id IN (123, 1234, 5678);
db1=# UPDATE t_article SET tags = tags || ARRAY['DB']
        WHERE id IN (1, 10, 123, 1234, 5678, 9000);

GINインデックスの性能改善

 PostgreSQL 9.4でGINインデックスはどれほど高速になるのでしょうか。

 以下のグラフは50万行の配列型データを使ったベンチマークテストの結果です。PostgreSQL 9.3.5と9.4 beta2とで比較した結果、9.4 beta2ではインデックスのファイルサイズが大幅に小さくなっており、データがある状態でのインデックスの作成、インデックスを使った検索、インデックスの付いたテーブルに対するデータ挿入、という全ての場面において高速化していることが分かります。

 この高速でサイズの小さなインデックスと、次ページで紹介するバイナリ版JSONデータ型(JSONB)を組み合わせると、従来とは異なるPostgreSQLの使い方が可能になってきます。次ページでは、JSONBと、この組み合わせを活用するための拡張モジュール、「jsquery」について見ていきます。

PostgreSQL 9.3.5と9.4 beta2におけるGINインデックスの性能比較(SRA OSS, Inc.による「PostgreSQL 9.4 検証レポート」から引用、テスト条件はレポートを参照)
       1|2 次のページへ

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。