Upgrade to Pro — share decks privately, control downloads, hide ads and more …

PostgreSQLのVACUUMとは.pdf

Ken Kato
September 21, 2024

 PostgreSQLのVACUUMとは.pdf

Ken Kato

September 21, 2024
Tweet

More Decks by Ken Kato

Other Decks in Technology

Transcript

  1. © 2024 Wantedly, Inc. はじめに • VACUUMはPostgreSQL固有のもので、PostgreSQL = VACUUMという人がい るくらい特徴的な機能

    • 普段意識することはほとんどないが、たまにVACUUMに関するアラートがなる ◦ この辺り前提を知っておくと障害対応がスムーズに
  2. © 2024 Wantedly, Inc. 更新型アーキテクチャ (DELETE) レコードA レコードB レコードC レコードD

    レコードE レコードA レコードB レコードC レコードE DELETE
  3. © 2024 Wantedly, Inc. 追記型アーキテクチャ (DELETE) レコードA レコードB レコードC レコードD

    レコードE レコードA レコードB レコードC レコードD レコードE DELETE 削除フラグ
  4. © 2024 Wantedly, Inc. 更新型アーキテクチャ (UPDATE) レコードA レコードB レコードC レコードD

    レコードE レコードA レコードB' レコードC レコードD レコードE UPDATE
  5. © 2024 Wantedly, Inc. 追記型アーキテクチャ (UPDATE) レコードA レコードB レコードC レコードD

    レコードE レコードA レコードB レコードC レコードD レコードE レコードB’ UPDATE 削除フラグ
  6. © 2024 Wantedly, Inc. VACUUM レコードA レコードB レコードC レコードD レコードE

    レコードA レコードB レコードC レコードE VACUUM 削除フラグ 不要行を再利用可能な状態にする
  7. © 2024 Wantedly, Inc. レコードG レコードH レコードI レコードJ レコードK レコードL

    レコードM レコードG レコードH レコードI レコードJ レコードK レコードL レコードM VACUUMが行われないと... レコードA レコードB レコードC レコードD レコードE レコードB’ レコードF • ディスク容量の増加 • パフォーマンスの低下 ◦ 不要行のスキャン ◦ メモリに乗り切らずディスク I/O発生
  8. © 2024 Wantedly, Inc. AUTOVACUUMの天敵 AUTOVACUUMが実行されたにも関わらず、不要行が削除されないケースがある • 「tuples: 0 removed,

    31451545 remain, 28808942 are dead but not yet removable, oldest xmin: 69055180」 主な原因は「ロングトランザクション」 • 全てのトランザクションが参照しないことがわかっているデータのみを VACUUMできる • あるトランザクションが長時間実行中だと、そのトランザクションが開始された後に削除された行は VACUUMできない
  9. © 2024 Wantedly, Inc. おまけ • ROLLBACKした時の挙動ってどうなるんだろう? ◦ INSERT ->

    ROLLBACKした場合、追加した行はそのままテーブル内に残る ◦ DELETE -> ROLLBACKした場合、削除フラグが撤去される • 再利用可能になった行はどうなるんだろう? ◦ 再利用可能になった行は空き領域マップで管理されており、そこを参照して新しいレコードを挿入す る • なんで追記型アーキテクチャを採用したの? ◦ 追記型アーキテクチャのメリットとしては、読み取りと書き込みのロック競合を回避できる
  10. © 2024 Wantedly, Inc. 追記型アーキテクチャのメリット レコードA レコードB レコードC レコードD レコードE

    T1 (読み取り) T2 (書き込み) BEGIN SELECT COMMIT レコードA レコードB レコードC レコードD レコードE BEGIN UPDATE B COMMIT レコードA レコードB’ レコードC レコードD レコードE レコードA レコードB レコードC レコードD レコードE レコードB’ SELECT
  11. © 2024 Wantedly, Inc. 参考 • https://www.postgresql.jp/document/16/html/routine-vacuuming. html • https://masahikosawada.github.io/2021/12/22/MVCC-and-GC-in-

    PostgreSQL/ • https://www.slideshare.net/slideshow/vacuum-250648997/25064 8997 • https://www.fujitsu.com/jp/products/software/resources/feature- stories/postgres/article-index/architecture-overview/