PostgreSQL
PostgreSQL11

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

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

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

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

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

おわりに

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

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

参考

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