Slide 1

Slide 1 text

© 2024 Wantedly, Inc. PostgreSQLのVACUUMとは めぐろLT #24 Feb. 17 2025 - Ken Kato

Slide 2

Slide 2 text

© 2024 Wantedly, Inc. 自己紹介 加藤 健 所属:ウォンテッドリー株式会社 職種:インフラエンジニア 業務:AWS上でKubernetes、PostgreSQLを運用 X: @kkato25

Slide 3

Slide 3 text

© 2024 Wantedly, Inc. はじめに ● VACUUMはPostgreSQL固有のもの ● PostgreSQL = VACUUMという印象を持つ人もいるくらい特徴的な機能 ● VACUUMがどんなものか、ざっくり理解してもらえたら 🙆

Slide 4

Slide 4 text

© 2024 Wantedly, Inc. VACUUMとは VACUUM = 掃除機 ガベージコレクション的なやつ

Slide 5

Slide 5 text

© 2024 Wantedly, Inc. アーキテクチャの違い 追記型アーキテクチャ 更新型アーキテクチャ Oracle MySQL SQL Server PostgreSQL

Slide 6

Slide 6 text

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

Slide 7

Slide 7 text

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

Slide 8

Slide 8 text

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

Slide 9

Slide 9 text

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

Slide 10

Slide 10 text

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

Slide 11

Slide 11 text

© 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発生

Slide 12

Slide 12 text

© 2024 Wantedly, Inc. AUTOVACUUM テーブル内の不要行の数や割合を元に自動的にVACUUMを実行する ● autovacuum_vacuum_threshold (不要行の数) ● autovacuum_vacuum_scale_factor (不要行の割合) 基本的にはAUTOVACUUMに任せれば大丈夫!

Slide 13

Slide 13 text

© 2024 Wantedly, Inc. AUTOVACUUMの天敵 AUTOVACUUMが実行されたにも関わらず、不要行が削除されないケースがある ● 「tuples: 0 removed, 31451545 remain, 28808942 are dead but not yet removable, oldest xmin: 69055180」 主な原因は「ロングトランザクション」 ● 全てのトランザクションが参照しないことがわかっているデータのみを VACUUMできる ● あるトランザクションが長時間実行中だと、そのトランザクションが開始された後に削除された行は VACUUMできない

Slide 14

Slide 14 text

© 2024 Wantedly, Inc. まとめ ● PostgreSQLでは追記型アーキテクチャを採用している ○ DELETE / UPDATE時には、実際に削除は行われず、削除フラグをつけている ● VACUUM: 削除フラグのついた行を再利用可能な状態にすること ● AUTOVACUUM: 自動的にVACUUMを実行してくれる ● 不要行が削除されない場合、ロングトランザクションを疑う

Slide 15

Slide 15 text

© 2024 Wantedly, Inc. Wantedly Tech Night ~ウォンテッドリーで内製している開発用ツールの紹介 ~

Slide 16

Slide 16 text

© 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/