PostgreSQL 10がやってくる！(その1)

これは[PostgreSQL Advent Calendar 2016](http://qiita.com/advent-calendar/2016/postgresql)の17日目の記事です。

先日の[PGCONF.Asiaでネタ系](http://www.slideshare.net/toshiharada/pgconf-asia201612203pg-reversija)を使い切ってしまったし、今年一年の自分の活動報告をここでするのもアレだし・・・ということで、今日は若干手抜きの記事になります。すいません。

# PostgreSQL 10がやってくる！
9月にPostgreSQL 9.6がリリースされ、みなさんパラレルクエリなどの新機能を満喫されているかと思いますが、もちろん次バージョンの開発もコミュニティは着々と進めています。

次のバージョンは9.7ではなく、10。ついに9から10になります。でもって、バージョン番号体系もx.y.zからx.yという体系に変わるようです。10以降は1桁目(x)がメジャーバージョン、2桁目(y)がマイナーバージョンを表すっぽい。

# 英語もC言語も読みたくないけど、10の新機能が知りたい

PostgreSQL 10の開発中ソースコードはGitリポジトリから入手できます。また、ドキュメントについても(どこまで新機能が反映されているかは不明ですが)Web上で公開されています。

- [ソースコードリポジトリの説明](https://www.postgresql.org/docs/devel/static/git.html)
- [PostgreSQL 10devel Documentation](https://www.postgresql.org/docs/devel/static/index.html)

なのですが・・・
> ぬこは激怒した。必ず、かのアドベントカレンダーのネタを書かなければならぬと決意した。ぬこにはポスグレがわからぬ。ぬこは、横浜の社畜である。psqlを使い、猫と遊んで暮して来た。けれどもC言語と英語に対しては、人一倍に苦手であった。

私はC言語も英語も苦手なので、まずはあえて動かしながら差分を調べてみようと思います。
今回は以下の4つの観点で差分を比較して、そこからPostgreSQL 10に何が組み込まれそうか推測してみます。

- make check
- データベースクラスタ
- PostgreSQLパラメータ
- システムカタログ

## make check
PostgreSQLをソースコードからビルド(手順は[Installation from Source Code](https://www.postgresql.org/docs/devel/static/install-getsource.html)あたりを参照)したあと、ビルドされたPostgreSQLがビルド先の環境で正しく動作するかをチェックするリグレッションテストを動かします。
このリグレッションテストには、当然ながら10の新機能のテストも含まれているはずなので、9.6のリグレッションテストと10のリグレッションテストの結果を比較することで、なんとなく10の新機能を推測してみる。
### 差分
意外にもtsrfというテストが1つ増えているのみ。
他はカテゴリ内でのテスト実行順番が変わっているなどしかないように見える。まだ開発途中なのでテストが追加されていないだけ、ということかもしれない。

## データベースクラスタ
PostgreSQL 9.6とPostgreSQL 10がビルドできたので、それぞれinitdbコマンドでデータベースクラスタを生成し、データベースクラスタ内の差分を見てみる。
### 差分
差分として見えたのは、今までWAL(Write Ahead Log)が格納されていたディレクトリ名がpg_xlogからpg_walに変更されたくらいかな。

でも、この変更は名称変更だけとはいえ何気に影響範囲が大きい。WALはPostgreSQLのリカバリやバックアップに関わる重要な情報というのもあるし、PostgreSQLが提供しているユーティリティや、外部プロジェクトのツール(pg_rmanとかのバックアップユーティリティなど)にも、この名称変更の影響はあるだろうし・・・

旧版との互換性保持のために、pg_xlog という名前のシンボリックリンクも作らなかったのだなあ。
## PostgreSQLパラメータ
PostgreSQL のパラメータはSHOW ALLなどのコマンドでさくっと確認できるが、SHOW ALLでは現在の設定値しか見えないので、きちんと調べようとすると、[pg_settings](https://www.postgresql.org/docs/devel/static/view-pg-settings.html)システムビューの全列を検索したほうが良い。
(9.6調査のときにも最大値の変更などが結構見つかったので)

### 差分
sourcelineやdesriptionの差分はリストアップしていません。

* log_line_prefixのデフォルト値が空値から、'%m [%p] 'に変更。
* max_parallel_workers パラメータの追加。デフォルト値は8。おそらく、9.6ではmax_worker_processで全体的なワーカプロセス数の上限を決めていたが、パラレルスキャンに関するワーカプロセス専用の変数として追加したのかな？
* max_parallel_workers_per_gather のデフォルト値が0から2に変更。9.6でもbeta-1では3になっていたが正式版では0になっていた。このデフォルト値が2になったということは、パラレル処理可能なオペレータが増えて、大抵の場合にはパラレル処理が有効になるということかもしれない。
* max_wal_sizeとmin_wal_sizeのunitが空値から、16MBになった。サイズ(単位つきで)指定しない場合には、WALファイルの個数相当で指定可能になったということかな。
* password_encryptionのデフォルト値がonから、md5に変更。
* server_versionは言わずもがな。

ということで、意外と現時点ではパラメータの変分は多くないです。これも、今後機能が追加されていけば増えていくのだろうけど。

## システムカタログ

まず、システムテーブル/ビュー単位での差分を見てみる。

* pg_partitioned_tableテーブルの追加。これは10の目玉機能になりそうな新しいパーティション機能に関するものでしょうね。ここは別途、詳細に調査しないと・・・
* pg_sequencesビューの追加。え？シーケンスに関するカタログって今までなかったんだっけ・・・？
  * シーケンス名、初期値、最大値、最小値などの値が確認できる。

その他、サイズの変更がある＝列の増減や、初期登録されたレコードの増減がありそうなテーブルは以下。

* pg_amproc
* pg_attribute
* pg_depend
* pg_rewrite

### おまけ \d コマンドの変更
上記の4テーブルについて、psqlの"\d リレーション名" のメタコマンドで違いを調べてみるか・・・と思ったら、なんと\dメタコマンドの出力内容が異なるのに気づく。

* PostgreSQL 9.6での\d出力

```
postgres=# \d pg_amproc
      Table "pg_catalog.pg_amproc"
     Column      |   Type   | Modifiers 
-----------------+----------+-----------
 amprocfamily    | oid      | not null
 amproclefttype  | oid      | not null
 amprocrighttype | oid      | not null
 amprocnum       | smallint | not null
 amproc          | regproc  | not null
Indexes:
    "pg_amproc_fam_proc_index" UNIQUE, btree (amprocfamily, amproclefttype, amprocrighttype, amprocnum)
    "pg_amproc_oid_index" UNIQUE, btree (oid)
```

* PostgreSQL 10での出力

```
postgres=# \d pg_amproc
                Table "pg_catalog.pg_amproc"
     Column      |   Type   | Collation | Nullable | Default 
-----------------+----------+-----------+----------+---------
 amprocfamily    | oid      |           | not null | 
 amproclefttype  | oid      |           | not null | 
 amprocrighttype | oid      |           | not null | 
 amprocnum       | smallint |           | not null | 
 amproc          | regproc  |           | not null | 
Indexes:
    "pg_amproc_fam_proc_index" UNIQUE, btree (amprocfamily, amproclefttype, amprocrighttype, amprocnum)
    "pg_amproc_oid_index" UNIQUE, btree (oid)
```

9.6までのModifiersがCollation, Nullable, Defaultのフィールドに詳細化されたのかな？

### サイズ変更があったシステムカタログ

* pg_amproc
  * 列の変更はなし。
  * 9.6のときには546行登録されていたが、10では404行に減っている。インデックス用の演算子が減ったというのはどういうことなのか・・・？
* pg_attribute
  * 列の変更はなし。
  * 登録行数は9.6の2417から2448に増加。まあ、システムカタログの列もここに登録されているので、行数の変分があるのは当然か。
* pg_depend
  * 列の変更はなし。
  * 登録行数は9.6の7329から7181に減少。まあ、システムカタログの列もここに登録されているので、行数の変分があるのは当然か。
* pg_rewrite
  * 列の変更はなし。
  * 登録行数は117から118に増加。

# わかったこと

* データベースクラスタ内のディレクトリpg_xlogがpg_walに変更された。
* パラメータの変更はパラレルスキャン関連など。
* システムカタログとして、新しいパーティション機能に関していそうなpg_partitioned_tableとシーケンス確認用のビューのみ。今のところは。
* psqlのメタコマンドもまたもや進化している。要チェック。

# おわりに

あくまでも今日時点での情報なので、今後、α版やβ版が出たらいろいろな変更が入っていると思うので、今後も追跡調査が必要ですねー。
あと、なんとか今日中にアップできて良かった。危ないところだった。

明日は、本アドベントカレンダーの主催者である[yancya](http://qiita.com/yancya)さんです。楽しみですね！

# どうでもいいけど
"PostgreSQL 10"って、日本ではどう呼ばれるのかな。
「ぽすぐれじゅう」なのか「ぽすぐれてん」なのか。
Oracleの場合だと、「おらくるてんじー」「おらくるいれぶんじー」と呼んでる人の方が多かった気がする。