【PostgreSQL 11】外部テーブル (postgres_fdw) を利用したパーティションテーブルを作成してみた (その1)

明けましておめでとうございます。
サイオステクノロジー OSS サポート担当 Y です。

今年もよろしくお願い致します。

今回は、PostgreSQL 11 にて postgres_fdw (外部テーブル) 及び宣言的パーティショニングを利用したパーティションテーブルを作成してみました。(※以下の内容は CentOS 7.6/PostgreSQL 10.6/PostgreSQL 11.1 にて検証しています。)

■はじめに

一昨日リリースされた PostgreSQL 10 の新機能である宣言的パーティショニングでは、postgres_fdw を使った外部テーブルを子テーブルに設定することが可能です。

また、昨年リリースされた PostgreSQL 11 では、宣言的パーティショニングと postgres_fdw に関連する機能強化が実施されています。

今回は、PostgreSQL 11 で強化された部分を含めて、宣言的パーティショニングと postgres_fdw に関連する検証を実施してみました。

■環境構成

それではさっそく、検証してみます。

今回は以下の様な構成で、パーティションテーブル (RANGE パーティション) を作成します。

■子テーブルの準備

親テーブル (pgsql11_parent.example.com) 側では、postgres_fdw のインストール等の複数の作業が必要であるため、先に子テーブル側 (pgsql11_child*.example.com) で必要な作業を実施しておきます。

以下の様に、各ノードでテーブルを作成します。子テーブル側での作業は基本的にこれだけです。

■postgres_fdw の準備

親テーブルを作成する pgsql11_parent.example.com 上では、postgres_fdw を使った外部テーブルを作成する必要がありますが、postgres_fdw は contrib モジュールとして提供されているため、必要に応じてインストールを実施します。(今回はソースコードからインストールしています)

各 contrib モジュールのソースコードは、PostgreSQL の tar ボールを展開したディレクトリ配下の contrib/<モジュール名> というディレクトリに格納されているため、当該ディレクトリに移動し make 及び make install を実行します。(※make install はインストール先ディレクトリの権限等、必要に応じて root ユーザ権限で実行します。)

make install が完了すると、/lib/ 配下に postgres_fdw.so というファイルが格納されているはずです。

次に、psql で PostgreSQL に接続し CREATE EXTENSION コマンドを実行します。

CREATE EXTENSION が完了すると、以下の様に pg_extension に postgres_fdw の項目が出力されます。

postgres_fdw のインストールはこれで完了です。

■外部テーブルを利用したパーティションテーブル作成

それでは、外部テーブルの作成とそれらを利用したパーティションテーブルの作成を実施してみます。

まずは、親テーブルを作成するサーバ (pgsql11_parent.example.com) 上で外部サーバを定義します。(外部サーバの定義方法の詳細等については割愛します。)

上記の様に外部サーバを定義した後に、これらの外部サーバ上にあるテーブル (外部テーブル) を使ってパーティションテーブルを作成します。

まずは、親テーブルを作成します。

この時点では、まだ子テーブルが作成されていない親テーブルのみが存在しています。

次に、外部テーブルを利用して、上記親テーブルの子テーブルを作成します。

\d+ コマンドにて親テーブルである foreign_hoge の詳細を確認すると、子テーブルが作成されていることが確認できます。

■テストデータの格納及び参照

前述した方法で作成したパーティションテーブルにデータを INSERT してみます。

上記の様に、親テーブルにデータを INSERT することができました。

また、各子テーブル (外部テーブル) にそれぞれデータが振り分けられていることも確認できます。

ちなみに、PostgreSQL 10 で同じ構成のパーティションテーブルを作成し、INSERT を実行すると以下の様なエラーになってしまいます。

PostgreSQL 10 では、上記の様に外部テーブルを利用した子テーブルに対してレコードをルーティングできない (親テーブルに INSERT できない) という制約がありましたが、PostgreSQL 11 では外部テーブルを利用した子テーブルに対してレコードをルーティングできる (親テーブルに INSERT できる) ように機能強化されています。

■最後に

今回は、PostgreSQL 11 にて外部テーブルを利用したパーティションテーブルを作成してみました。

PostgreSQL 10 で追加された機能である宣言的パーティショニングには制約事項が多かったのですが、PostgreSQL 11 では以前紹介したデフォルトパーティションHash パーティショニングの様な機能強化に加え、外部テーブルを利用したパーティショニングの機能も強化されています。

次回は、外部テーブルを利用したパーティションテーブルと、ローカルで作成した (外部テーブルを利用しない) パーティションテーブルの動作を検証してみようと思います。

ご覧いただきありがとうございます! この投稿はお役に立ちましたか?

役に立った 役に立たなかった

0人がこの投稿は役に立ったと言っています。

コメント投稿

メールアドレスは表示されません。


*