地方エンジニアの学習日記

興味ある技術の雑なメモだったりを書いてくブログ。たまに日記とガジェット紹介。

【PostgreSQL】HOTとは

PostgreSQLにおけるHOTの解説

PostgreSQLにはHOT(Heap Only Tuples)という機能があります。これは特定の条件下でUPDATEやDELETE処理のパフォーマンスを改善する仕組みです。本記事では、このHOTについて解説します。

PostgreSQLのUPDATE/DELETEの基本動作と課題

PostgreSQLはMVCC(Multi-Version Concurrency Control)を採用しており、データの変更時に古いバージョンのデータを保持し、新しいバージョンのデータを追記します。

  • UPDATE: 内部的には、古い行に削除マークを付け、新しい行を挿入する動作となります。
  • DELETE: 行に削除マークを付けるのみで、物理的な削除はすぐには行われません。

これらの古い行(不要タプル)は、VACUUM処理によって後ほど回収されます。

この仕組みにおいて、インデックスが存在する場合、考慮すべき点があります。UPDATEやDELETEが発生するたびに、テーブル本体だけでなく、関連するすべてのインデックスも更新する必要が生じ、これがパフォーマンスに影響を与えることがあります。特にUPDATEでは、古い行と新しい行の両方に対応するインデックスエントリの管理が必要になります。

HOT (Heap Only Tuples) とは

HOTは、特定の条件下でインデックスの更新を省略する最適化技術です。

HOTが適用されるUPDATEでは、以下の手順が実行されます。

  1. 古いタプルに削除マークを設定します。
  2. 新しいタプルを同じデータページ内に挿入します。
  3. 古いタプルに、新しいタプルの位置を示すポインタ(フラグ)を設定します。

これにより、インデックスは古いタプルを指したままでも、PostgreSQLはHOTポインタを辿って新しいタプルを発見できます。結果として、インデックス更新処理が省略され、UPDATE処理の効率が向上します。

まとめ

PostgreSQLのHOTは、UPDATE処理におけるインデックス更新のコストを削減するための最適化機能です。HOTが適用される条件を理解し、FILLFACTORの調整やインデックス設計を考慮することで、データベースのパフォーマンス改善につながる可能性があります。pg_stat_user_tablesビューで適用状況を確認し、HOTの効果を考慮に入れることが推奨されます。