- fsync
- postgresql.conf(またはpostgresのコマンドラインオプション)で設定
- offにするとDBクラッシュ時に回復不可能なデータ破壊になるリスクがある。ユニットテスト用のDBなど、壊れてもいいから高速化したい場合に利用すると良い。
- synchronous_commit
- セッションごと、トランザクションごとに設定可能
- offにすると、fsyncは行うがその完了を待たずにクライアントに成功を返す。DBクラッシュ時にデータが壊れることはないが、コミットしたはずの変更が失われるリスクがある。本番でoffにすることも十分見合うトレードオフ。
- 有効な値は何種類かある: remote_apply、on(デフォルト)、remote_write、local、off
set synchronous_commit = 'off'
にして単純なINSERT文を試してみたところ、0.8msくらい短縮できた。
postgres=# insert into users (name, start_date, end_date) values ('hoge', '2023-10-01', '2023-10-02');
INSERT 0 1
時間: 1.351 ミリ秒
postgres=# set synchronous_commit = 'off';
SET
時間: 0.700 ミリ秒
postgres=# insert into users (name, start_date, end_date) values ('hoge', '2023-10-01', '2023-10-02');
時間: 0.526 ミリ秒
公式ドキュメントの記述はやや分かりづらいが、内部的な動作はCOMMITについて少し考えてみた(3)の通りらしい。