PostgreSQL11がやってくる！(1) - パラメータの差異

## はじめに

にゃーん。

5/24にPostgreSQL 11のbeta1がリリースされたので、早速、PostgreSQL 11について調べてみることにした。

いろいろ気になる機能の追加はあるが、まずはPostgreSQLの設定パラメータの違いを見てみることにする。

## 概要

PostgreSQL 10とPostgreSQL 11のパラメータの差異の概要はこんな感じ。

| 種別                                | 個数 |
| ----------------------------------- | :--- |
| PostgreSQL 11で追加されたパラメータ | 21   |
| PostgreSQL 11で変更されたパラメータ | 1    |
| PostgreSQL 11で削除されたパラメータ | 1    |

まだbeta1なので、今後変更は増えるかもしれないが、ほとんどがパラメータの追加っぽい。



## PostgreSQL 11で追加されたパラメータ

| パラメータ名                           | メモ                                                         |
| -------------------------------------- | ------------------------------------------------------------ |
| data_directory_mode                    | Unix系システムでのデータディレクトリの権限。この設定値はinitdb時に  `--allow-group-access`で指定する。<br />従来は 700 の権限でなければならなかった。 |
| enable_parallel_append                 | 11からparalell appendが対応するっぽい？<br />デフォルトはon。<br />これをoffにしたほうが実行時間が短くなるケースもあるのだろうなあ。 |
| enable_parallel_hash                   | こっちはparalell hash joinの有効/無効のフラグ。<br />デフォルトはon。<br />enable_hash_joinが無効だと、もちろんこいつも無効。 |
| enable_partition_pruning               | これが有効だと、実行計画生成時点で検索対象外となるパーティションを除外するのかな。<br />デフォルトはon。 |
| enable_partitionwise_aggregate         | パーティション単位のグループ化・集計を有効または無効にする。<br />デフォルトはoff。<br />これをonにすると実行計画生成時にCPUとメモリを結構喰うからデフォルトはoffになってるぽい。 |
| enable_partitionwise_join              | パーティション単位の結合を有効または無効にする。<br />デフォルトはoff。<br />有効なケースが結構限定されてて、かつ、これをonにすると実行計画生成時にCPUとメモリを結構喰うからデフォルトはoffになってるぽい。 |
| jit                                    | JIT(Just-in-Time        Compilation)をPostgreSQLで使用するかどうかのフラグ。デフォルトはon。 |
| jit_above_cost                         | JITコンパイルを使うかどうかの閾値？<br />なんとなく、JITコンパイルは時間がかかるけど、それを使ったクエリは高速に実行できるのだと思うので、ここのパラメータ調整が肝になるのかなあ？<br />デフォルトは100000。この数値の単位ってなんだろ？ |
| jit_debugging_support                  | PostgreSQL開発者向けオプション。<br />これをonにすると、JITコンパイルで生成された関数をgdbに登録できるっぽい。<br />デフォルトはoff。 |
| jit_dump_bitcode                       | PostgreSQL開発者向けオプション。<br />JITコンパイルで生成されたコードをファイルにダンプしてくれるものかな？<br />デフォルトはoff。 |
| jit_expressions                        | PostgreSQL開発者向けオプション。<br /> コスト計算の対象となる式をJITコンパイルするかどうかを決定します・・・とGoogle翻訳先生は言ってるが、正直、意味がよくわからぬ。<br />デフォルトはon。 |
| jit_inline_above_cost                  | JITコンパイルされたコードのインライン化に関するパラメータ？<br />デフォルトは500000。                                                             |
| jit_optimize_above_cost                | jit_above_costとセットで調整するものっぽい？<br />デフォルトは500000。 |
| jit_profiling_support                  | PostgreSQL開発者向けオプション。<br /> JITによって生成されたperf to profile関数を許可するために必要なデータを出力する。<br />Perf解析も見据えたオプションがあるのなあ。 |
| jit_provider                           | どのJITプロバイダを使用するか指定する。<br />デフォルトはllvmjit。                                                             |
| jit_tuple_deforming                    | PostgreSQL開発者向けオプション。<br /> コスト計算の決定に従い、タプル変形がJITコンパイルされるかどうかを決定する。<br />デフォルト値はon。<br />タプル変形(tuple deforming)ってなんだろう・・・？ |
| max_parallel_maintenance_workers       | 1つのユーティリティコマンドから起動できる並列ワーカー数の最大値。<br />現状(PostgreSQL 11)では、btreeインデックス指定時の```CREATE INDEX```コマンドのみ対応している。<br />デフォルトは2。 |
| parallel_leader_participation          | リーダープロセスがワーカープロセスを待つのではなく、ギャザーとギャザーマージノードでクエリプランを実行できるようにします。 <br />デフォルトはon。<br />これのon/offで性能差がどのくらい出るんだろうなあ・・・。 |
| ssl_passphrase_command                 | 非公開鍵などのSSLファイルを解読するためのパスフレーズを取得する必要がある場合に呼び出される外部コマンドを設定する。普通は使う必要はないっぽい。<br />デフォルトは空文字列。 |
| ssl_passphrase_command_supports_reload | ssl_passphrase_commandで設定されたパスフレーズコマンドをリロード(pg_ctl reloadのことかな？)中に呼び出すかどうかを指定する。<br />デフォルトはoff。 |
| vacuum_cleanup_index_scale_factor      | VACUUM時に、索引スキャンを実行せずに挿入できる、前の統計収集でカウントされたヒープ・タプルの合計数の割合を指定する。なるほど、わからん。<br />デフォルト値は0.1。 |



## PostgreSQL 11で変更されたパラメータ

| パラメータ名     | メモ                                                         |
| ---------------- | ------------------------------------------------------------ |
| wal_segment_size | 単位がブロック数ではなく、バイト数に変更された。<br />それにともない初期設定値が2048から16777216に変更された。 |
|                  |                                                              |



## PostgreSQL 11で削除されたパラメータ

| パラメータ名            | メモ                                                         |
| ----------------------- | ------------------------------------------------------------ |
| replacement_sort_tuples | リリースノートより。<br />" Replacement sorts were determined to be no longer useful."<br />身も蓋もないｗ <br />まあ、自分もこのパラメータを有効に使ったことは一度もないが・・・。 |
|                         |                                                              |

## おわりに

ざっとパラメータの差異を見てみたが、新機能のJITまわりと、パラレルクエリ強化に伴うものが大半を占めている。

データベースクラスタを配置するディレクトリ権限の変更が可能になったというのは、1つのデータベースサーバ上に、複数のOSユーザを使って運用するケースで有用なのかな？

## 参考
JITコンパイルについては、喜田さんがなんか試しているっぽい。後で、きちんと見よ。
http://kkida-galaxy.blogspot.jp/2018/04/postgresql11-with-jit-01.html