【PostgreSQL 11 新機能】パーティションニングされたテーブル (親テーブル) への INDEX 作成を試してみた

こんにちは。サイオステクノロジー OSS サポート担当 Y です。

今回は PostgreSQL 11 (現時点ではまだ beta 版) の新機能である “パーティションニングされたテーブル (親テーブル) への INDEX 作成” を検証してみました。(※以下の内容は CentOS 7.5/PostgreSQL 10.5/PostgreSQL 11beta3 にて検証しています。)

■はじめに

昨年リリースされた PostgreSQL 10 の新機能である Declarative Partitioning では、パーティショニングされたテーブルの親テーブルに INDEX を作成することができませんでした。しかし、PostgreSQL 11 では、パーティショニングされた親テーブルに INDEX を作成することができるようになる予定です。

今回は PostgreSQL 11beta3 を使って、この親テーブルへの INDEX 作成を試してみようと思います。

■検証 (PostgreSQL 10 の動作確認)

まずは PostgreSQL 10 の動作を確認してみます。(以下の例では LIST パーティションを使用しています)

PostgreSQL 10 にて、上記の様にパーティショニングされたテーブルの親テーブル “hoge” に INDEX を作成しようとすると、以下の様に ERROR になってしまいます。

■検証 (PostgreSQL 11 の動作確認)

それでは、PostgreSQL 11beta3 でパーティショニングされたテーブルの親テーブルに INDEX を作成してみます。

まずは、前述した PostgreSQL 10 の検証と同じテーブルを作成します。

この状態で親テーブル “hoge” に対して INDEX を作成してみます。すると、PostgreSQL 10 の様に ERROR にはならずに、親テーブル “hoge” に正常に INDEX が作成されていることが確認できます。

この親テーブルに作成された INDEX ですが、上記 \d+ の結果からはテーブル “hoge” に 1つの INDEX が作成されている様に見えています。しかし、実際には以下の様に各子テーブルに INDEX が作成される様です。

また、\d+ の “Indexes:” 欄に出力されている “hoge_test_idx” は別途管理されているようであり、pg_class.relkind の値が “I” になっていました。

pg_class のドキュメントを参照すると、pg_class.relkind の “I” は “partitioned index” というオブジェクトを示すものである旨の記載がありました。詳細は追えていませんが、親テーブルに作成された INDEX は通常の INDEX とは異なるオブジェクトとして扱われているようです。(通常の INDEX は pg_class.relkind の値が “i” (小文字の i) になります)

■最後に

PostgreSQL 10 のパーティショニングでは、子テーブルに個別に INDEX を作成する必要がありましたが、PostgreSQL 11 親テーブルに対して INDEX を作成できるようになっているので、かなり便利になっている様に感じます。

また、リリースノートを見るとパーティショニングされたテーブルに主キーや外部キーも設定できるようになっているようなので、PostgreSQL 11 ではパーティショニングがかなり使いやすくなっているのではないでしょうか。

PostgreSQL 11 には他にも新機能が多くあるため、次回も PostgreSQL 11 の新機能の検証を実施してみようと思います。

>> 雑誌等の執筆依頼を受付しております。
   ご希望の方はお気軽にお問い合わせください!

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

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

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

コメント投稿

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


*