テーブルのパーティショニングを検討した話
現場でRDBMSとして一部PostgreSQLを使用しているのですが、最近巨大テーブルの性能向上検討をする機会がありました。
最終的にテーブルのパーティショニングに行き着いたのですが、その際に便利な拡張機能についても調査したので共有しようと思います。
●パーティショニングとは
パーティショニングは、データをパーティション(子テーブル)に分割して保持する機能です。データはパーティションに分割されますが、それらを束ねて1つのテーブルとして扱うことが可能です。これをパーティションテーブルと言います。不要になったらパーティション自体の削除が出来るため、上手く使えばレコード削除で起こりがちなデッドタプル/インデックスの肥大化などについても効果が期待出来そうです。
PostgreSQLのパーティショニングでは、パーティションの分割単位を「範囲」「リスト」「ハッシュ」から選択可能なのですが、今回の巨大テーブルは時系列データであったため、「範囲」で分割する方針としました。
●パーティションのメンテナンスはどうしよう…
「範囲」パーティショニングを使った際に特に問題になってくるのが、パーティションの管理です。標準ではパーティションの作成や削除は手動で実行しなくてはなりません。
対象が数テーブルなら良いですが、該当する大量レコードのテーブルは100個以上存在しています。今回のケースでは手動での対応は現実的ではありません…。
何か良い方法はないかと調べたところPostgreSQLの拡張機能にて、まさにパーティション管理機能がありましたので、実際に動作検証してみることにしました。
●拡張機能pg_partman
パーティションを作成、管理するためのPostgreSQLの拡張機能。インストールすると、pg_partmanが使う管理用テーブルやトリガー、ファンクション等が作成されます。これらを使用して初期設定やパーティションを管理を行います。
代表的なファンクションとテーブルは以下の通りです。
○ファンクション
・create_parent()
パーティションを生成し、パーティション管理用のテーブルに管理設定情報を書き込む。
・run_maintenance_proc()
管理用テーブルの管理設定をもとにパーティションの追加・削除を行う。
○テーブル
・part_configテーブル
パーティションの管理情報を定義するテーブル。
■基本的な使い方
① パーティションの作成
パーティションテーブルを作成し、紐付くパーティションをpg_partmanのファンクション「create_parent」で生成する。
② パーティションテーブル管理用テーブルの設定
①でパーティションを生成すると「part_config」テーブルに生成したパーティション情報が登録される。必要に応じてパーティション保持期間等の管理設定を変更する。
③ メンテナンス
定期的にメンテナンス用のファンクション「run_maintenance_proc」を実行する。このファンクションの実行は冪等性が保証されている。
パーティションテーブルが複数個存在していたとしても、③の実行だけでパーティション追加/削除などのメンテナンスが可能です。
今回は簡単にパーティショニングと、拡張機能を紹介させていただきました。pg_partmanはパーティションを使う上でかなり便利で、パーティションを使用する場合は、必須級の拡張機能だと思います。
巨大なテーブルの管理にはパーティショニング、拡張機能pg_partmanを合わせて検討してみても良いのではないでしょうか。
もしこの記事が何かの参考になりましたら幸いです。
第1システム事業部 第3グループ I.Y