Posted at

PostgreSQL 11がやってくる!(2) - システムカタログの差分を見てみる

More than 1 year has passed since last update.


はじめに

にゃーん。

前回は、PostgreSQL 10とPostgreSQL 11の設定パラメータの差分を探ってみた。

今回は、PostgreSQL 10とPostgreSQL 11のシステムカタログの差分を見てみる。PostgreSQLではDDL=システムカタログと言ってもいいくらい密接な関係がある。なので、システムカタログの差分を見ることによって、どんなDDLの追加や変更があったのかを、想像することができたりする。また、PostgreSQLの挙動を監視するための稼動統計情報ビューの差分を見ることで、PostgreSQL監視用のスクリプトへの影響も事前に調査することもできたりする。

じゃあ早速見てみよう。


テーブル/ビュー単位の変更

なんと、現時点ではテーブル/ビュー単位での変更差分はなかった。

ハッシュパーティションがPostgreSQL 11で入ったけど、既存のパーティション用システムカタログの枠で管理できるってことなんかな。あと、新規の稼動統計情報ビューもなさげか。


列単位の変更

列の追加や変更はそれなりに多い。

表/ビュー名
変更箇所
メモ

pg_aggregate
aggfinalmodify,
aggmfinalmodifyの追加
遷移状態の値の保持(読み込みのみ、書き込みあり)に関するフラグかな?
CREATE AGGREGATEに影響があるんだろうか。

pg_attribute
atthasmissing, attmissingvalの追加
後で列が追加されたときのDEFAULT値の情報。フラグ(atthasmissing)とその値(attmissingval)なのかな。
もしかすると高速ALTER TABLE機能が入ったってことなんだろうか(実テーブルへの変更がかからない

pg_class
relhaspkeyの削除
relrewriteの追加
従来、主キー存在チェックにはrelhaspkeyを使ってたけど、11からはpg_indexを使いなさいよ、とリリースノートには書いてある。
relrewriteについては、「 表リライトを必要とするDDL操作中に新しいリレーションが書き込まれる場合、これには元のリレーションのOIDが含まれる。内部的な(一時的な?)情報らしいので、普段は0しか入らないっぽい?

pg_constraint
conparentidの追加
conincludingの追加
pg_constraint_conparentid_indexインデックス(btree)の追加
conparentidはパーティション表の制約に関する情報っぽい。
conincludingは、制約付き列と同じインデックスに含まれる非制約列のリスト・・・どういうときに使うのか、まだよくわかってない。

pg_index
indnkeyattsの追加
索引のキー列の数、らしい。今までなかったんだー。

pg_partitioned_table
partdefidの追加
デフォルトパーティションに該当するpg_classの値。そっか、デフォルトパーティションって11からだっけか。

pg_proc
proisagg, proiswindowの削除
prokindの追加
いままで集約関数やウインドウ関数かどうかをフラグで管理していたけど、プロシージャの追加も含めて、11からはcharで種別をもつようになったっぽい。
通常関数はf、プロシージャはp、集約関数はa、ウィンドウ関数はw

pg_publication
pubtruncateの追加
ロジカルレプリケーションの対象にTRUNCATEが追加されたから、そのフラグかな。

pg_stat_wal_receiver
sender_hostの追加
sender_portの追加
レプリケーション送信元のホスト名とポート番号が参照できるようになったみたい。


おわりに

これは現時点(beta1)時点の調査なので、正式版リリース時点では多少変わっている可能性はあるので、今後のbetaリリースタイミングで、再調査は必要かもしれない。

あと、システムカタログの差分から、PostgreSQL 11の新機能や変更内容の一部が読み取れるのはいつもながらに面白いなあ。システムカタログの差分自体は、表/ビュー単位の追加ならともかく、列の変更だけだとリリースノートに掲載されないこともあるので、こういう調査はそれなりに大事だと思ってはいる。