π§Ή PostgreSQLμ μ¬μ©νλ€λ©΄ Vacuumμ λν΄ λ°λμ μ μ΄ν΄νκ³ μ μ νκ² κ΄λ¦¬ν΄μΌ ν©λλ€.
μΌλ§μ μ΄μνκ³ μλ μλΉμ€μ Vacuum μ ν΅ν κ΄λ¦¬κ° μ λλ‘ λμ§ μμλ μ΄μ λ‘ DBλΆνκ° μ¬νκ² μμ μ₯μ κ° λ°μν μ μ΄ μμ΅λλ€. μ΄λ² ν¬μ€ν μμλ μ κ²½μ°μ§ μμΌλ©΄ μλΉμ€μ μΉλͺ μ μΌ μ μλ Vacuum μ μν μ λν΄ μμΈν μμλ³΄λ €κ³ ν©λλ€.
Vacuum μ 첫 λ²μ§Έ μν , 곡κ°ν보!
Vacuumμ μ¬μ μ μλ―Έλ "μ§κ³΅μ²μκΈ°λ₯Ό μ΄μ©ν μ²μ" μ λλ€. UPDATE μ DELETE λ₯Ό ν΅ν΄ λ³κ²½ λλ μμ λ μλ£λ€μ΄ μ°¨μ§ νκ³ μλ λμ€ν¬ 곡κ°μ λ€μ μ¬μ©νκΈ° μν΄ λΆνμν μ°λ κΈ° λ°μ΄ν°λ€μ μ 리νκ³ , λμ€ν¬ 곡κ°μ ν¨μ¨μ±μ λμ λλ€.
μ λΆνμν μ°λ κΈ° λ°μ΄ν°κ° 곡κ°μ μ°¨μ§νλκ±ΈκΉμ?
λ€μ€ λ²μ λμμ± μ μ΄
PostgreSQLμμλ UPDATEλ DELETE μμ λμμ΄ λ ν΄λΉ μλ£μ μ λ²μ μ μμ μλ£ ν λ°λ‘ λ²λ¦¬μ§ μμ΅λλ€. μ΄ μμ μ λ€μ€ λ²μ λμμ± μ μ΄(multiversion concurrency control, MVCC) κΈ°λ²μ ꡬννλλ° μ΄μ μ΄ μκΈ° λλ¬Έμ λλ€. λμμ μ¬λ¬ κ°μ λ°μ΄ν° λ²μ μ μ 곡ν μ μλ κΈ°λ²μΌλ‘ μ΄ν΄νμλ©΄ μ½μ΅λλ€. μμ λ μλ£λ₯Ό λ€λ₯Έ νΈλμμ μμ μ¬μ©νκ³ μλ€λ©΄, κ·Έ μλ£κ° μμ λλ©΄ μλκΈ° λλ¬Έμ μ¬λ¬ κ°μ λ²μ μΌλ‘ κ΄λ¦¬νλ κ²μ΄μ£ .
νμ§λ§, λ€λ₯Έ νΈλμμ μ΄ λ μ΄μμ΄ κ·Έ μ λ²μ μλ£μ λν μ κ·Όμ΄ νμ μλ€λ©΄, μ λ²μ μλ£λ μΈλͺ¨ μλ μλ£κ° λ©λλ€. μ΄ μνλ‘ κ³μ μ΄μ λλ€λ©΄, λμ€ν¬μλ μΈλͺ¨ μλ μλ£λ€μ΄ λμ²λκ² λλλ°, μ΄ μ¬μ©ν΄μλ μλ μλ£λ€μ μ 리ν΄μ κ·Έ μλ£κ° μμλ 곡κ°μ μ 리νλκ² vacuumμ μν μ λλ€. Vacuumμ΄ κ³΅κ°μ μ 리νλ λ°©λ²μ μμΈν 2κ°μ§λ‘ λλ©λλ€.

Vacuumμ΄ κ³΅κ°μ μ 리νλ λ κ°μ§ λ°©λ²
1. μ€λλ μ΄μ λ²μ λ μ½λ μμ μμ μ ν΅ν κ³΅κ° ν보 - Vacuum
첫λ²μ§Έ μμ μ μΈλͺ¨μλ μλ£λ₯Ό μ 리νκ³ , κ·Έ μ리λ₯Ό λ€λ₯Έ μλ£κ° μ μ₯λ μ μλλ‘ λΉκ³΅κ°μΌλ‘ νμνλλ°μ. μ¬μ€ μ΄ μμ μ μ΄μ체μ μ μ₯μμ λμ€ν¬ μ¬μ 곡κ°μ ν보νλ κ²μ μλ―Ένμ§λ μκ³ μ±μμ§ μ μκ² λΉμμ£Όλ κ²μ μλ―Έν©λλ€.

2. μ€λλ μ΄μ λ²μ λ μ½λ μμ μμ νμ κ³΅κ° μμΆ - Vacuum Full
μ΄μ λ°λλ‘ Vacuum Full μμ μ ν΄λΉ ν μ΄λΈμ μ¬μ©ν μ μλ μλ£λ€λ§ λ°λ‘ λͺ¨μ μμ μ νμΌμ μ μ₯νλ λ°©μμ λλ€. μ€μ λμ€ν¬ μ¬μ 곡κ°μ ν보νκ³ ν΄λΉ ν μ΄λΈμ μ΅μ μ 물리μ ν¬κΈ°λ‘ λ§λλ μμ μ΄μ£ . νμ§λ§ λ°λμ μ£Όμν΄μΌν μ¬νμ μ΄λ€ λͺ λ Ήμ ν μ΄λΈ λμμΌλ‘ λ°°νμ μ κΈμ νλ€λ μ μ λλ€. νμ€ vacuum μμ κ³Όλ λ¬λ¦¬ DMLκ³Ό λ½ νΈνμ±μ΄ μκ³ μ¬μ§μ΄λ SELECT λ₯Ό μννλ μΈμ λ λ½μ λκΈ°ν΄μΌν©λλ€. μ¦, μ΄ μμ μ΄ μλ£λκΈ° μ κΉμ§ κ·Έ ν μ΄λΈμ λμμΌλ‘ νλ λ€λ₯Έ λͺ¨λ μμ λ€μ λ€λ₯Έ μΈμ μμλ ν μ μκ² λ©λλ€. μΆκ°λ‘, μ΄λ€ μμ μ μμ λμ€ μλ³Έκ³Ό λ€λ₯Έ μλ‘μ΄ λ³΅μ¬λ³Έ μλ£λ₯Ό λ§λ€κΈ° λλ¬Έμ κ·Έλ§νΌμ λμ€ν¬ 곡κ°μ΄ νμνλ€λ κ²λ κΈ°μ΅ν΄μΌν©λλ€.

3. κΆμ₯λλ μ λ΅μ? autovacuum!
μΌλ°μ μΌλ‘ κΆμ₯λλ μ λ΅μ 첫λ²μ§Έ νμ€ vacuum μ μ£ΌκΈ°μ μΌλ‘ μμ μ ν΄μ κΎΈμ€ν λΉ κ³΅κ°μ ν보ν΄μ, λλ²μ§Έ μμ μΈ full vacuumμ ν΄μΌνλ μν©μ λ°©μ§νλ κ²μ λλ€. λμ€ν¬κ° μ΄λ μ λ 컀μ§μ§ μλλ‘ κ³μν΄μ λ€λ₯Έ μλ£κ° μ μ₯λ μ μλλ‘ μ리λ₯Ό ν보ν΄μ£Όλ κ²μ΄μ£ . μ΄ μ λ΅μ μν΄ νμ€ vacuumμ μλμΌλ‘ μ€νν΄μ£Όλ autovacuum κΈ°λ₯μ νμ©ν©λλ€. λ¬Όλ‘ λμ΄μ λ³κ²½/μμ κ° μμ ν μ΄λΈμ μ 리λ₯Ό ν΅ν΄ λμ€ν¬ 곡κ°μ ν보νκΈΈ μνλ€λ©΄ full vacuum μμ μ μ ννλ κ²λ λ°©λ²μ λλ€.
λ§μ½ autovacuum κΈ°λ₯μ μ¬μ©νμ§ μλλ€λ©΄, ν΄λΉ λ°μ΄ν°λ² μ΄μ€ μλ²μμ μ¬μ©νκ³ μλ λͺ¨λ λ°μ΄ν°λ² μ΄μ€μ λν΄μ κ΄λ¦¬μκ° μ§μ VACUUM μμ μ ν΄μΌν©λλ€. μΌλ°μ μΌλ‘ ν루μ ν λ² λ°€μκ°μ μ§μ νλ κ²μ΄ μΌλ°μ μ΄λ©°, μλ£κ° λΉλ²νκ² λ³κ²½λλ ν μ΄λΈμ λν΄μλ λ μμ£Ό vacuum μμ νκΈ°λ ν©λλ€. (μμ£Ό λΉλ²ν ν μ΄λΈμ λν΄μ λͺ λΆμ ν λ²μ© μμ νλλ‘ μ€μ νκΈ°λ ν©λλ€.)
Vacuum μ λ λ²μ§Έ μν , XID Frozen!
μ¬μ€ κ³΅κ° μ¬νμ©μ μν Vacuumμ νμ μ¬νμ μλλλ€. λ¨μ§ λμ€ν¬ μ¬μ© ν¨μ¨κ³Ό ν μ΄λΈ λ΄μ κ³΅κ° νμ© ν¨μ¨μ΄ λ¨μ΄μ§ λΏμ΄μ£ . νμ§λ§ XID Frozenμ μν vacuum μμ μ λ°λμ μνν΄μΌνλ μμ μ λλ€. autovacuumμ νμ©νμ§ μλλ€λ©΄ λ°λμ μλ vacuumμ ν΄μΌνλ μ΄μ μ΄κΈ°λ ν©λλ€.
XID κ° λλ°?
PostgreSQLμμλ νΈλμμ μλ£μ λν΄ MVCC κΈ°λ²μ νμ©νλ€κ³ μμμ μΈκΈνμ΅λλ€. MVCCλ μΏΌλ¦¬κ° μνν μμ μ λ°μ΄ν° λ²μ μ μ½μ μ μλ κΈ°λ₯μ μ 곡νλλ°, μ΄λ 'μνν μμ 'μ κΈ°μ€μ νΈλμμ ID (XID) μ λλ€. ν μ΄λΈ λ΄μ μ΄μ λ°μ΄ν°μ νμ¬ λ°μ΄ν°κ° λμμ μ μ₯λκΈ° λλ¬Έμ, μμ μ λ§λ λ°μ΄ν°λ₯Ό μΆμΆνκΈ° μν΄ λ μ½λ λ³λ‘ XIDλ₯Ό μ§μ νλ€κ³ μκ°νλ©΄ λ©λλ€. XIDλ₯Ό μ«μλ‘ μ²λ¦¬νκ³ κ·Έκ²μ λΉκ΅νλ λ°©μμ νμ©νμ¬ μΏΌλ¦¬κ° μμλ μμ μ XIDμ κ°κ±°λ μμ λ°μ΄ν° λ²μ μ μ½λ κ²μ΄ MVCCμ ν΅μ¬μ΄μ£ . Readμ Write μμ κ°μ λΈλ‘νΉμ μλ²½ν μ κ±°ν¨μΌλ‘μ¨ λμμ±μ λμΌ μ μκΈ° λλ¬Έμ λλ€.
μ¬μ€ λ μ½λ λ³λ‘ XIDκ° μ‘΄μ¬νλ€λ κ²μ κ³΅κ° μ¬μ© μΈ‘λ©΄μμ λ§€μ° λΉν¨μ¨μ μ λλ€. XID λ₯Ό μ μ₯νκΈ° μν΄μλ λ μ½λλΉ 4λ°μ΄νΈκ° μΆκ°λ‘ νμνκΈ° λλ¬Έμ λλ€. κ·Έλμ PostgreSQLμ FrozenXID λΌλ νΉλ³ XIDλ₯Ό 미리 μμ½ ν΄ λμ΄ μ¬μ©ν©λλ€. μΌλ°μ μΈ λΉκ΅ λμμμ νμ 보μ¬μ§λ XID, μ¦ μ΄λ ν XIDλ³΄λ€ μμ Frozen XIDλ₯Ό μ μ©νμ¬ νμ visible ν μνλ‘ μ μ§νλ κ²μ λλ€.

Frozen XID ?
νμ 보μ¬μ§λ XID λΌλ κ°λ μ μ’ λ μμΈν μμλ³΄κ² μ΅λλ€. μΌλ°μ μΈ XID λΉκ΅ λ°©λ²μ 2μ 32μΉ λλ¨Έμ§ μ°μ°μ μ΄μ©ν©λλ€. μ΄ λ§μ 20μ΅ κ°μ "μ" XIDμ, 20μ΅ κ°μ "μ" XID λ‘ λλκ³ , μ΄ XID κ°μ κ³μ μν νλ©° μ¬μ©νλ€λ λ»μ λλ€. κ·Έλμ ν XIDλ‘ μ μ₯ λμλ€λ©΄, κ·Έ μ΄ν 20μ΅ κ°μ νΈλμμ μ΄ μκΈ°κΈ° μ κΉμ§λ κ·Έ μλ£λ "μ" XIDλ‘ μ²λ¦¬λμ§λ§, κ·Έ μ΄μμ νΈλμμ μ΄ μκΈ°λ©΄ κ·Έ μ XIDλ μμΌλ‘ μ μ₯λ XIDλ‘ κ°μ£Όν΄ λ²λ¦½λλ€. μ΄ λ¬Έμ λ₯Ό νΌνλ λ°©λ²μ 20μ΅ νΈλμμ μ΄ μκΈ°κΈ° μ μ, κ·Έ μ XID μλ£μ XID κ°μ FrozenXIDλ‘ λ°κΎΈλ κ²μ λλ€. μ΄λ κ² μꡬ 보κ΄μ© μλ£λ‘ λ°κΏ λμΌλ©΄, νΈλμμ XID λΉκ΅ μμ μμ νμ μ μΈ λκΈ° λλ¬Έμ, XID κ²ΉμΉ¨ μ€λ₯λ₯Ό νΌν΄κ° μ μκ² λκ³ , μ΄ XID λ³κ²½ μμ μ λ°λ‘ VACUUM (anti-wraparound autovacuum) μ΄ ν©λλ€.

Vacuum μ μΈ λ²μ§Έ μν , μ€μλ£ μ§λ κ°±μ
vacuum μμ μ μ€μλ£ μ§λλ₯Ό κ°±μ νλ μμ μ ν©λλ€. μ€μλ£ μ§λ(visibility map, vm)λ νμ¬ μμ μ€μΈ νΈλμμ λ€(λλ κ·Έ μλ£λ€μ΄ λ³κ²½ λκΈ° μ κΉμ§ μ΄μ©ν λ―Έλμ λͺ¨λ νΈλμμ λ€)μ΄ μ€μ λ‘ μ¬μ©ν μλ£λ€μ λν κ° ν μ΄λΈλ³ μ§λμ λλ€.
μ΄ μ§λ μ 보λ μΈλ±μ€ μ μ© μΏΌλ¦¬λ€μ λν΄μ λΉ λ₯Έ μλ΅μ μ 곡νλλ° μ¬μ©λ©λλ€. PostgreSQLμμ μ΄λ€ μλ£λ₯Ό ν΄λΉ μΈμ μκ² λ³΄μ¬ μ£Όμ΄μΌ ν μ§λ₯Ό κ²°μ νλ μ 보λ, κ·Έ μλ£μ ν μ΄λΈ νμ΄μ§κΉμ§ μ΄ν΄ 보μμΌ μ μ μμ΅λλ€. νμ§λ§ μΈλ±μ€ μ μ© κ²μμΈ κ²½μ°μλ ν μ΄λΈ νμ΄μ§λ₯Ό κ²μνμ§ μκ³ λ¨Όμ μ΄ μ€μλ£ μ§λλ₯Ό κ²μν΄μ μ΄κ³³μ ν΄λΉ μλ£κ° μλ€λ©΄ κ·Έκ²μ μ¬μ©ν©λλ€. κ·Έλ§νΌ ν μ΄λΈ νμ΄μ§ μ½κΈ° μμ μ μ€μΌ μ μκ³ , νΉνλ ν μ΄λΈ ν¬κΈ°κ° ν° κ²½μ°λΌλ©΄ λμ€ν¬ μ½κΈ° μμ μ μλΉν μ€μ΄λ ν¨κ³Όλ₯Ό λ³Ό μ μμ΅λλ€. μλνλ©΄, μ€μ ν μ΄λΈ νμ΄μ§ 보λ€, μ΄ μ€μλ£ μ§λμ ν¬κΈ°λ ν¨μ¬ μκΈ° λλ¬Έμ΄μ£ .

Vacuum μ λ€ λ²μ§Έ μν , μ€νκ³ν ν΅κ³ μ 보 κ°±μ
PostgreSQL 쿼리 μ€ν κ³νκΈ°λ 쿼리μ μ’μ μ€ν κ³νμ μ§κΈ° μν΄μ κ° ν μ΄λΈμ μ μ₯λ μλ£λ₯Ό λ°νμΌλ‘ μμ§λ ν΅κ³ μ 보λ₯Ό μ΄μ©νλλ°, μ΄ ν΅κ³ μ 보λ ANALYZE λͺ λ Ήμ μ΄μ©ν΄μ λ§λ€μ΄μ§λλ€. κ·Έλ¦¬κ³ VACUUM λͺ λ Ήμ μννλ©΄μ μ΅μ μΌλ‘ ANALYZE μμ μ ν μλ μμ΅λλ€. ν΅κ³ μ 보 κ°±μ μμ μ΄ μ λλ‘ λμ§ μμΌλ©΄ μλ λμ§ μμ 쿼리 μ€ν κ³νμ΄ μ§μ¬μ§κ³ , μ 체μ μΌλ‘ λ°μ΄ν°λ² μ΄μ€ μ±λ₯μ λ¨μ΄λ¨λ¦¬λ κ²°κ³Όλ₯Ό μ΄λνκΈ° λλ¬Έμ λ°λ₯Έ ν΅κ³ μ 보 κ°±μ μμ μ μ£ΌκΈ°μ μΌλ‘ νλ κ²μ λ§€μ° μ€μν©λλ€.
μμμ μ€λͺ ν autovacuum κΈ°λ₯μ μ΄μ©νλ€λ©΄, ν΅κ³ μ 보λ₯Ό κ°±μ ν΄μΌν νμμ±μ΄ μλ ν μ΄λΈλ€μ λν΄μ μ£ΌκΈ°μ μΌλ‘ ANALYZE λͺ λ Ήμ μλμΌλ‘ μνν©λλ€. ν΅κ³ μ 보 κ°±μ μμ λ λμ€ν¬ μ¬μ κ³΅κ° ν보λ₯Ό μν vacuum μμ κ³Ό λ§μ°¬κ°μ§λ‘ ν μ΄λΈμ μλ£ λ³νλμ΄ λ§μ κ²½μ°λ λΉλ²νκ² μ§ννλ κ²μ΄ μ’κ³ , κ·Έ λ°λμΈ κ²½μ°λ μ’ λ λλ¬Όκ² μ§ννλ κ²μ΄ μ’μ΅λλ€. λ¬Όλ‘ , ν μ΄λΈμ μλ£κ° λΉλ²νκ² λ³κ²½λλ€κ³ νλλΌλ κ·Έ λ³κ²½ λ΄μ©μ΄ μμ§ν ν΅κ³ μ 보μ κ΄λ ¨ μλ κ²μ΄λΌλ©΄ λΉμ°ν ν΅κ³ μ 보 κ°±μ μμ λ νμ μμ΅λλ€.
μ΄λ² ν¬μ€ν μμλ vacuumμ΄ νμν μ΄μ μ μν μ 4κ°μ§μ λν΄ μμ보μμ΅λλ€.
μ΄λ κ² vacuumμ΄ νμμ μΈ κ΄λ¦¬κ° νμνλ€λ©΄, κ³Όμ° μ΄λ»κ² μ μ ν μ€μ νκ³ νμ©ν΄μΌ μ±λ₯μ λ¬Έμ κ° μμμ§λ μμλ΄μΌκ² μ£ ? λ€μ ν¬μ€ν μμ μ 리ν΄λ³΄κ² μ΅λλ€. ππ»
- μ°Έκ³ μλ£
https://www.interdb.jp/pg/pgsql06.html
https://bstar36.tistory.com/308