Database

[PostgreSQL] Vacuum

spursOnTop 2025. 3. 5. 01:46
๋ฐ˜์‘ํ˜•

๐Ÿ“Œ Vacuum์ด๋ž€?

PostgreSQL์€ MVCC (Multi-Version Concurrency Control)์„ ์‚ฌ์šฉํ•˜์—ฌ ํŠธ๋žœ์žญ์…˜์„ ๊ด€๋ฆฌํ•˜๋Š”๋ฐ, ์ด๋ฅผ ์œ„ํ•ด ์‚ญ์ œ๋˜๊ฑฐ๋‚˜ ์—…๋ฐ์ดํŠธ๋œ ๋ ˆ์ฝ”๋“œ(ํŠœํ”Œ)๊ฐ€ ์ฆ‰์‹œ ์ œ๊ฑฐ๋˜์ง€ ์•Š๊ณ  Dead Tuple๋กœ ๋‚จ์•„ ์žˆ๊ฒŒ ๋˜๋ฉฐ, ์ด๋ฅผ ์ •๋ฆฌํ•˜๋Š” ๊ณผ์ •์„ VACUUM์ด๋ผ ๋ถ€๋ฆ„.

+ Dead Tuple : UPDATE์™€ DELETE ์‹œ ๊ธฐ์กด ๋ฐ์ดํ„ฐ๋ฅผ ์ฆ‰์‹œ ์‚ญ์ œํ•˜์ง€ ์•Š๊ณ  ์ด์ „ ๋ฒ„์ „์œผ๋กœ ๋‚จ๊ฒจ๋‘ ์œผ๋กœ์จ ์ƒ๊ธฐ๋Š” ๋ฏธ์‚ฌ์šฉ ๋ฐ์ดํ„ฐ.

๐Ÿ“Œ MVCC (Multi-Version Concurrency Control)๋ž€?

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ๋™์‹œ์— ์—ฌ๋Ÿฌ ํŠธ๋žœ์žญ์…˜์ด ์ ‘๊ทผํ•  ๋•Œ ์ผ๊ด€์„ฑ๊ณผ ์„ฑ๋Šฅ์„ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š” ๊ธฐ๋ฒ•์œผ๋กœ PostgreSQL, Oracle, MySQL (InnoDB), MS SQL Server ๋“ฑ ์—ฌ๋Ÿฌ DBMS์—์„œ ์‚ฌ์šฉ.

MVCC๋Š” ์ฝ๊ธฐ ์ž‘์—…(SELECT)๊ณผ ์“ฐ๊ธฐ ์ž‘์—…(INSERT, UPDATE, DELETE)์„ ์ถฉ๋Œ ์—†์ด ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋„๋ก ์—ฌ๋Ÿฌ ๋ฒ„์ „์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์œ ์ง€ํ•˜๋Š” ๋ฐฉ์‹ ์ด๋ฅผ ํ†ตํ•ด ํŠธ๋žœ์žญ์…˜ ๊ฐ„ ๋ฝ(lock) ์ถฉ๋Œ์„ ์ค„์ด๊ณ  ์„ฑ๋Šฅ์„ ํ–ฅ์ƒ

1. ํŠธ๋žœ์žญ์…˜์˜ ๊ณ ์œ  ID (Transaction ID, XID)

PostgreSQL์—์„œ๋Š” ๊ฐ ํŠธ๋žœ์žญ์…˜๋งˆ๋‹ค ๊ณ ์œ ํ•œ ID๊ฐ€ ํ• ๋‹น๋˜๋ฉฐ,  MVCC๋Š” ์ด ID๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ์˜ ๊ฐ€์‹œ์„ฑ์„ ํŒ๋‹จํ•จ.

2. ๋ฐ์ดํ„ฐ ๋ฒ„์ „ ๊ด€๋ฆฌ

  • INSERT: ์ƒˆ๋กœ์šด ํ–‰(row)์ด ์ถ”๊ฐ€๋˜๋ฉด ํ•ด๋‹น ํ–‰์— ํŠธ๋žœ์žญ์…˜ ID(XID)๊ฐ€ ํ• ๋‹น
  • UPDATE: ๊ธฐ์กด ๋ฐ์ดํ„ฐ๋ฅผ ์ง์ ‘ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๊ณ , ์ƒˆ๋กœ์šด ๋ฒ„์ „์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ƒ์„ฑํ•˜๋ฉฐ, ๊ธฐ์กด ๋ฐ์ดํ„ฐ๋Š” ์‚ญ์ œ๋˜์ง€ ์•Š๊ณ  ๋‚จ์•„ ์žˆ์Œ
  • DELETE: ๋ฐ์ดํ„ฐ๋ฅผ ์ฆ‰์‹œ ์‚ญ์ œํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, ํ•ด๋‹น ๋ฐ์ดํ„ฐ๊ฐ€ ์‚ญ์ œ๋˜์—ˆ๋‹ค๋Š” ํ‘œ์‹œ๋งŒ ๋‚จ๊ธฐ๊ณ  ์œ ์ง€

๐Ÿ“Œ Vacuum์˜ ํ•„์š”์„ฑ

  • ๋””์Šคํฌ ๊ณต๊ฐ„ ์ ˆ์•ฝ
    • ๋ถˆํ•„์š”ํ•œ Dead Tuple์„ ์ œ๊ฑฐํ•˜์—ฌ ๊ณต๊ฐ„์„ ์žฌ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Œ
  • ์ฟผ๋ฆฌ ์„ฑ๋Šฅ ์œ ์ง€
    • ์ธ๋ฑ์Šค๊ฐ€ Dead Tuple์„ ํฌํ•จํ•˜๋ฉด ๊ฒ€์ƒ‰ ์„ฑ๋Šฅ์ด ์ €ํ•˜๋  ์ˆ˜ ์žˆ์Œ
  • Freezing (ํŠธ๋žœ์žญ์…˜ ID wraparound ๋ฐฉ์ง€)
    • PostgreSQL์—์„œ๋Š” ํŠธ๋žœ์žญ์…˜ ID(XID) ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ ๋ฌธ์ œ๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ์ฃผ๊ธฐ์ ์œผ๋กœ VACUUM์ด ํ•„์š”
  • Autovacuum์ด ์ถฉ๋ถ„ํ•˜์ง€ ์•Š์„ ๋•Œ
    • DELETE ๋˜๋Š” UPDATE ์ž‘์—…์ด ๋งŽ์œผ๋ฉด autovacuum๋งŒ์œผ๋กœ๋Š” ์ถฉ๋ถ„ํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Œ

๐Ÿ“Œ Vacuum ์‹คํ–‰ ๊ด€๋ จ ๋ช…๋ น์–ด

-- DB ์ „์ฒด ํ’€ ์‹คํ–‰
vacuum full analyze;

-- DB ์ „์ฒด ๊ฐ„๋‹จํ•˜๊ฒŒ ์‹คํ–‰
vacuum verbose analyze;

-- ํ•ด๋‹น ํ…Œ์ด๋ธ”๋งŒ ๊ฐ„๋‹จํ•˜๊ฒŒ ์‹คํ–‰
vacuum analyze [ํ…Œ์ด๋ธ” ๋ช…];

-- ํŠน์ • ํ…Œ์ด๋ธ”๋งŒ ํ’€ ์‹คํ–‰
vacuum full [ํ…Œ์ด๋ธ”๋ช…];

 

๐Ÿ“Œ AutoVacuum

Vacuum์ด DB๋‹จ์—์„œ ์ž„๊ณ„์น˜์— ๋”ฐ๋ผ ์ž๋™์œผ๋กœ ์ˆ˜ํ–‰๋˜๋Š” ๊ฒƒ์„ AutoVacuum์ด๋ผ๊ณ  ํ•˜๋ฉฐ, AutoVacuum์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ์•„๋ž˜ ๋‘๊ฐ€์ง€ ์ƒํ™ฉ์—์„œ ์ˆ˜ํ–‰๋œ๋‹ค.

  • Dead Tuple์˜ ๊ฐœ์ˆ˜์˜ ๋ˆ„์ ์น˜๊ฐ€ ์ž„๊ณ„์น˜์— ๋„๋‹ฌํ–ˆ์„ ๋•Œ
  • Table์ด๋‚˜ Tuple์˜ age๊ฐ€ ๋ˆ„์ ๋˜์–ด ์ž„๊ณ„์น˜์— ๋„๋‹ฌํ–ˆ์„ ๋•Œ

 

๋ฐ˜์‘ํ˜•