非同期コミットのメリット
これに対して、8.3で追加された非同期コミットでは、こうしたリスクを避けることができる。データベースの整合性が失われることはなく、クラッシュ時にも直近のトランザクションが失われるだけである。不運にも同期書き込み前にシステムがクラッシュするなどしてトランザクションが失われた場合は、それを再実行すれば良い。
また、セッションごとにいつでも非同期コミットを有効にできるので、直近のデータを保証しなくてもよいようなセッションやトランザクションのみ非同期コミットを有効にするといった使い方ができる。つまり、データベースシステム全体のデータの確実性を犠牲にすることなく、特定のトランザクションだけスピードアップできるのだ。
非同期コミットの使い方
非同期コミットはデフォルトで無効になっている。有効にするには、postgresql.confで、
synchronous_commit = off
とする。
また、どのくらい直近のトランザクションを保証するか、ということをパラメータで指定できる。wal_writer_delayに設定した値(ミリ秒単位)の3倍より前のトランザクションなら、非同期コミットをオンにしてもデータが保証される(非同期コミットがオフの場合は、wal_writer_delayの値にかかわらず、常にトランザクションは保証される)。wal_writer_delayのデフォルト値は200なので、だいたい直近1秒前くらいまでのトランザクションが保証されることになる。
なお、wal_writer_delayは、PostgreSQLを再起動しない限り変更できないので、注意が必要だ。
非同期コミットの効果
非同期コミットは、pgbenchのように小さなトランザクションを大量に処理するような環境で威力を発揮する。筆者の手元のノートPCで行った実験では、非同期コミットを有効にした場合(wal_writer_delayはデフォルトのまま)、無効の場合よりも1.54倍高速だった。