Postgres Plus 9.4 独自のエンタープライズ向け新機能
Postgres Plus Advanced Server(以下、PPAS)は、Postgres Plus Enterprise Edition(以下、PPEE)のデータベース・エンジンで、PostgreSQLをベースとしパフォーマンスやセキュリティなどの分野のエンタープライズ向け機能が強力されています。
図1はPPAS 9.4の主な新機能をカテゴリ別にまとめたもので、エンジンであるPostgreSQL 9.4には性能、運用、可用性、データウェアハウス、開発などのカテゴリで主要な新機能が実装されており、PPAS 9.4には性能、運用でより使いやすいRDBMSを目指したエンタープライズ向けの機能が追加されています。
前回は、エンジンであるPostgreSQL 9.4の新機能の中からエンタープライズでの利用を想定した以下の機能に焦点を当ててご紹介しました。
- 性能 - HugePage対応
- 運用 - ALTER SYSTEMコマンド
- 可用性 - レプリケーション・スロット
- データウェアハウス - マテリアライズド・ビューの拡張
- 開発 - バイナリJSON
今回は、PPAS 9.4独自のエンタープライズ向け新機能として「パーティション」と「リソースマネージャ」をご紹介します。
ハッシュ・パーティションで用途に合わせたデータ分割
パーティションとは、図2のように大規模な表をパーティションというより小さくて管理しやすい固まりに分割して格納する機能です。各パーティションを異なるディスク領域へ配置することで検索処理を高速化したり、管理の効率化を図ることができます。
PPASではPostgreSQLと同様に「継承」「制約」「トリガ」の3つの機能を組み合わせてパーティショニング機能を実現していますが、PostgreSQLに比べて設定手順が簡略化されています。PostgreSQLでは親テーブル、パーティションの位置づけとなる子テーブルの作成に続き、データ挿入のためのINSERTトリガ作成など複数のステップを踏む必要がありますが、PPASはOracle Databaseのパーティションテーブルと同じ構文をサポートしており、親テーブルを作成するコマンド1つですべての作業が内部的に行われるため、設定はとても簡単です。(※1)
パーティションによる検索処理を高速化するために、内部ではパーティション・プルニングと呼ばれる機構が動作します。例えば、図3のようにsales表から5月の売り上げを検索する場合、WHERE句にパーティションキーであるorderdate列を「2013-05-01から2013-05-31」と指定すると、4月から6月分のデータが格納されたパーティションにのみアクセスします。それによりディスクI/Oを抑制し、処理の高速化を実現しています。
PostgreSQLではテーブルに定義したCHECK制約を利用してアクセスする子テーブルを絞り込みます。そのため、子テーブルの数が増えると絞り込む際にオーバーヘッドが発生する可能性があり、子テーブルは100個程度が上限と言われています。PPASではこの点にも改善が加えられており、1,000個の子テーブルを持つテーブルに対する複数セッションからの検索処理では最大76倍、大量データの挿入では450倍以上の性能向上が確認されています。(※1)
(※1)PPASのパーティションテーブル作成コマンド、処理性能の詳細は、以下の記事をご参照ください。→「Postgres Plus 9.3 いかに進化したのか検証してみた」
一般的にパーティションには用途に応じていくつかの種類が用意されており、PPASでは従来から「レンジ」「リスト」がサポートされています。どちらのパーティションを利用するかはパーティション・キーに指定する列の値をどのような方法で分割するかで決定します。
レンジ・パーティションは、図4のようにパーティション・キーの範囲や期間に基づいて、データを分割します。これは最も広く使われているパーティション化で、主に日付データとともに使用されます。例えば、売り上げデータなど時系列で生成されるデータに対して、年、四半期、月といった日付をWHERE句に指定してアクセスする場合に有効です。また、リスト・パーティションは、国や地域、都道府県など順不同で関連性のないデータをグループ化し、任意のパーティションへ格納する場合に有効な手法です。
そして、今回、もう1つの主要パーティションである「ハッシュ」がPPAS 9.4でサポートされます。ハッシュ・パーティションは、レンジやリストによる分割が難しいデータをPPAS独自のハッシュ・アルゴリズムによって均等に分割します。レンジやリストによる分割はデータ自体に依存するため、図5にあるように各パーティションに格納されるサイズが均等にならないケースがありますが、ハッシュはパーティション間でデータを均等に分散するため、すべてのパーティションはほぼ同一のサイズになります。これにより、主にデータ挿入を含むバッチ処理でディスクアクセスを均等化し、パフォーマンスの向上が期待できます。今後、1つの処理を複数のプロセスで並列に実行できるパラレルクエリが実装されれば、ハッシュ・パーティションのメリットがより活かせるようになります。
さらに、Postgres Plusでは図6のように各パーティションの下にさらに小さいサブセットを持たせるサブパーティションもサポートされており、「レンジ」「リスト」「ハッシュ」の3種類のパーティションを用途にあわせて自由に組み合わせることができます。例えば、売り上げデータを年(レンジ)、国(リスト)で分割すると、期間ごとの各地域の売り上げを参照するアプリケーションで効果を発揮します。