はじめに
前回までの記事の続きです。今回はチェックポインターについて学んでいきます。
もはや初めて聞くワードなので、ChatGPTに座学をしてもらいながら学んでいきます。
💡 チェックポインターとは何か
checkpointer(チェックポインター) は、
PostgreSQL の中で データの変更内容をディスクへ安全に書き出す役割を担うバックグラウンドプロセス です。
PostgreSQLは、データの更新 (INSERT, UPDATE, DELETE) を行っても
すぐにはディスクに書き込みません。
なぜなら、ディスクI/Oは非常に遅いため、
毎回書き込んでいたら性能が著しく低下してしまうからです。
代わりに PostgreSQL は次のような流れをとります👇
- メモリ上の共有バッファ(Shared Buffer) に変更を一時的に保存
- 同時に WAL(Write Ahead Log) にログを書き込む
- その後、一定のタイミングで checkpointer がディスクにまとめて反映
🧠 動作イメージ
→へぇ、毎回書き込んでいるわけではないんですね。FileのWriterとかと似ていますね。
というよりディスクに書き込むという意味では同じ処理なのかな。
Dirty Page(ダーティページ)とは
メモリ上で変更されているが、まだディスクに反映されていないページのことです。
なぜすぐディスクに書かないのか?
理由は明確です👇
ディスク I/O は遅いから。
もし 1 件の UPDATE ごとに fsync()(ディスク同期)していたら、
トランザクション性能が極端に悪化してしまいます。
そのため、PostgreSQL は次のように動作します。
- 変更内容を一旦メモリに保持(共有バッファ)
- 同時に WAL(ログ)に記録
- checkpointer がタイミングを見て、まとめてディスクに同期する
→ 「遅延書き込み + 安全保障型」の設計を採用しています。
チェックポイント(Checkpoint)とは
チェックポイント とは、
「ここまでの変更はすべてディスクに反映済み」と確定できる時点のことです。
これにより、
- クラッシュしても この時点までのデータは復旧可能
- それ以降の変更は WAL(ログ)から復旧可能
という安全な復旧ポイントが確立されます。
さいごに
今回のチェックポイントはInsertやUpdate実行時に毎回ディスクに書き込むのは非効率。
一定の間メモリに溜めておいて、一気にディスクに書き込みに行くというもの。