๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
์—‘์…ˆ ๊ฒฝ์Ÿ๋ ฅ/DB ์ธ์‚ฌ์ด๋“œ

DB ์ธ์‚ฌ์ด๋“œ | PostgreSQL Vacuum - 1. MVCC

by EXEM 2022. 4. 29.

๐Ÿ“ข Vacuum Series์˜ ์ฒซ ์‹œ์ž‘์œผ๋กœ, PostgreSQL์˜ MVCC๋ชจ๋ธ์— ๋Œ€ํ•ด ์•Œ์•„๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ๋ณธ ๋ฌธ์„œ์—์„œ๋Š” โ‘ MVCC๋™์ž‘ ๋ฐฉ์‹ ๋ฐ ์˜ˆ์ œ๋ฅผ ์„ค๋ช…ํ•œ ํ›„ โ‘กํ•ด๋‹น ๋ชจ๋ธ๋กœ ์ธํ•ด ๋ฐœ์ƒ ๊ฐ€๋Šฅํ•œ ๋ฌธ์ œ์ ๋“ค์„ ์•Œ์•„๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

MVCC ๋™์ž‘ ๋ฐฉ์‹

MVCC ๋ž€?

MVCC(Multi Version Concurrency Control)๋ž€ “๋‹ค์ค‘ ๋ฒ„์ „ ๋™์‹œ์„ฑ ์ œ์–ด”์˜ ์ค„์ž„ ๋ง๋กœ, ๊ณผ๊ฑฐ๋ถ€ํ„ฐ ํ˜„์žฌ๊นŒ์ง€์˜ ๋‹ค์–‘ํ•œ ๋ฒ„์ „ ๋ฐ์ดํ„ฐ๋“ค์— ๋Œ€ํ•œ ๊ด€๋ฆฌ์™€ ์ œ๊ณต์ด ๊ฐ€๋Šฅํ•œ์ง€๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” DBMS ํ•„์ˆ˜ ๊ธฐ๋Šฅ ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค. ์ฆ‰ ์‹œ์‹œ๊ฐ๊ฐ ๋ณ€ํ•˜๊ณ  ์žˆ๋Š” ๋ฐ์ดํ„ฐ ์ค‘ ์‚ฌ์šฉ์ž๊ฐ€ ์กฐํšŒ๋ฅผ ์‹œ์ž‘ํ•œ ์‹œ์ ์˜ ์ •ํ™•ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์ œ๊ณต๋ฐ›์„ ์ˆ˜ ์žˆ๋Š”์ง€๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๊ฒƒ์œผ๋กœ, ๊ทธ ๊ตฌํ˜„ ๋ฐฉ๋ฒ•์€ ๊ฐ๊ฐ์˜ DBMS๋งˆ๋‹ค ๋‹ค๋ฅด์ง€๋งŒ ๋ชฉ์ ๋งŒ์€ ๋ชจ๋‘ ๋™์ผํ•˜๋‹ค๊ณ  ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

PostgreSQL์˜ MVCC

์ตํžˆ ์•Œ๋ ค์ง„ ๋Œ€๋กœ Oracle์€ Undo๋ผ๋Š” ๊ณต๊ฐ„์„ ์ด์šฉํ•˜์—ฌ MVCC๋ฅผ ๊ตฌํ˜„ํ•˜์˜€์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ PostgreSQL์€ Undo ๊ฐ™์€ ๊ณต๊ฐ„์„ ์‚ฌ์šฉํ•˜๋Š” ๋Œ€์‹  ์•„๋ž˜์™€ ๊ฐ™์ด ์กฐ๊ธˆ์€ ํˆฌ๋ฐ•ํ•˜๊ณ  ๊ฐ„๋‹จํ•œ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜์—ฌ MVCC๋ชจ๋ธ์„ ๊ตฌํ˜„ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

๐Ÿ“Œ PostgreSQL์˜ MVCC ๊ตฌํ˜„ ๋ฐฉ๋ฒ•
1. ํ…Œ์ด๋ธ” ๋‚ด๋ถ€์— ๋ณ€๊ฒฝ ์ด์ „ ๋ฒ„์ „(๋“ค)๊ณผ ํ˜„์žฌ ๋ฒ„์ „์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋ชจ๋‘ ์œ„์น˜์‹œํ‚ต๋‹ˆ๋‹ค.
2. ๊ฐ ๋ ˆ์ฝ”๋“œ(row) ๋ณ„๋กœ 4 Byte์˜ ๋ฒ„์ „ ์ •๋ณด(XID)๋ฅผ ๋‘์–ด ์‹œ์ ์„ ์‹๋ณ„ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.
3. ์ˆ˜ํ–‰ ์‹œ์ ์˜ Transaction ID์™€ ๋ ˆ์ฝ”๋“œ์˜ XID (XMIN) ๋น„๊ต๋ฅผ ํ†ตํ•ด MVCC๋ฅผ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค.

XMIN / XMAX

MVCC ๋™์ž‘ ๋ฐฉ์‹์„ ์ดํ•ดํ•˜๊ธฐ์— ์•ž์„œ XMIN๊ณผ XMAX์— ๋Œ€ํ•ด ์•Œ์•„๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

๋ ˆ์ฝ”๋“œ ๋ณ„๋กœ ์กด์žฌํ•˜๋Š” XMIN๊ณผ XMAX๋Š” XID๋ฅผ ๊ธฐ๋กํ•˜๊ธฐ ์œ„ํ•œ ์šฉ๋„๋กœ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ํŠนํžˆ XMIN์€ Insert/Update๋ฅผ ์ˆ˜ํ–‰ํ•œ XID๋ฅผ, XMAX๋Š” Delete/Update๋ฅผ ์ˆ˜ํ–‰ํ•œ XID๋ฅผ ๊ธฐ๋กํ•˜๋Š” ์šฉ๋„๋กœ ์‚ฌ์šฉ๋˜๋Š”๋ฐ, ๋ฐ์ดํ„ฐ ์กฐ์ž‘(๋ณ€๊ฒฝ) ์‹œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.

  • Insert ๋ฐœ์ƒ ์‹œ ํ•ด๋‹น ์‹œ์ ์˜ XID๋ฅผ XMIN์— ์„ค์ •
  • Delete ๋ฐœ์ƒ ์‹œ ํ•ด๋‹น ์‹œ์ ์˜ XID๋ฅผ ์‚ญ์ œ ๋Œ€์ƒ ๋ ˆ์ฝ”๋“œ์˜ XMAX์— ์„ค์ •
  • Update ๋ฐœ์ƒ ์‹œ ๋ณ€๊ฒฝ ์ „ ๋ ˆ์ฝ”๋“œ์˜ XMAX์— ์ˆ˜ํ–‰ ์‹œ์ ์˜ XID๋ฅผ ์„ค์ •ํ•˜๊ณ (Delete์™€ ๋™์ผ), ๋ณ€๊ฒฝ ํ›„ ๋ ˆ์ฝ”๋“œ๋Š” ์ƒˆ๋กœ ์ž…๋ ฅํ•˜๋ฉฐ XMIN์— Update์‹œ์ ์˜ XID๋ฅผ ์„ค์ •
๐Ÿ“Œ XMAX๊ฐ’์ด Null ์ธ ๋ ˆ์ฝ”๋“œ์˜ ๊ฒฝ์šฐ ๊ฐ€์žฅ ์ตœ์‹  ๋ฒ„์ „์˜ ๋ ˆ์ฝ”๋“œ๋ฅผ ์˜๋ฏธํ•˜๋ฉฐ, XMAX ๊ฐ’์ด ์„ค์ •๋œ ๋ ˆ์ฝ”๋“œ๋Š” ํ•ด๋‹น ์‹œ์ ์— ๊ณผ๊ฑฐ ๋ฒ„์ „(์‚ญ์ œ ๋ฐ ๋ณ€๊ฒฝ)์œผ๋กœ ๋ณ€๊ฒฝ๋˜์—ˆ์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.
๐Ÿ’ก ๋ ˆ์ฝ”๋“œ, Row, Tuple๊ณผ ๊ฐ™์ด DBMS๋ณ„๋กœ ์‚ฌ์šฉํ•˜๋Š” ์šฉ์–ด์˜ ์ฐจ์ด๋Š” ์žˆ์ง€๋งŒ ๊ทธ ์˜๋ฏธ๋Š” ๋ชจ๋‘ ๋™์ผํ•ฉ๋‹ˆ๋‹ค. ๋ณธ ๋ฌธ์„œ๋ฅผ ํฌํ•จํ•œ Vacuum Series์—์„œ๋Š” ๋ ˆ์ฝ”๋“œ ๋ฐ Row๋ฅผ ํ˜ผ์šฉํ•ด ์‚ฌ์šฉํ•  ์˜ˆ์ •์ž…๋‹ˆ๋‹ค.

PostgreSQL MVCC ์˜ˆ์ œ

์•„๋ž˜ ์˜ˆ์ œ๋ฅผ ํ†ตํ•ด DML์ด ์ผ์–ด๋‚  ๋•Œ์˜ ํŽ˜์ด์ง€ ๋ณ€ํ™”๋ฅผ ์‚ดํŽด๋ณด๊ณ , PostgreSQL์˜ MVCC๋ชจ๋ธ์—์„œ ์‚ฌ์šฉ์ž์˜ ๋ฐ์ดํ„ฐ ์ฝ๊ธฐ ๊ณผ์ •์ด ์–ด๋–ค ์‹์œผ๋กœ ๋™์ž‘ํ•˜๋Š”์ง€ ํ™•์ธํ•ด๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

ํŽ˜์ด์ง€ ๋‚ด๋ถ€์˜ ๋ณ€ํ™”

  1. XID=999 ์‹œ์ ์— [A,10] ๊ฐ’์„ Insert ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๋•Œ ๋ ˆ์ฝ”๋“œ์˜ [XMIN, XMAX] ๊ฐ’์€ [999, Null]๋กœ ์„ค์ •๋ฉ๋‹ˆ๋‹ค
  2. XID=1000 ์‹œ์ ์— [B,20] ๊ฐ’์„ Insert ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๋•Œ ๋ ˆ์ฝ”๋“œ์˜ [XMIN, XMAX] ๊ฐ’์€ [1000, Null]๋กœ ์„ค์ •๋ฉ๋‹ˆ๋‹ค
  3. ์‹œ๊ฐ„์ด ํ˜๋Ÿฌ XID=2001 ์‹œ์ ์— [A,10] ๊ฐ’์„ [A,20]์œผ๋กœ Update ํ–ˆ์Šต๋‹ˆ๋‹ค. ํŽ˜์ด์ง€ ๋‚ด๋ถ€์—์„œ๋Š” ๋ณ€๊ฒฝ ์ „ ๋ ˆ์ฝ”๋“œ์ธ [A,10]์˜ XMAX ๊ฐ’์„ Update ์‹œ์ ์˜ XID์ธ 2001๋กœ ์„ค์ •ํ•˜์—ฌ ํ•ด๋‹น ๋ ˆ์ฝ”๋“œ๊ฐ€ ๊ณผ๊ฑฐ ๋ฒ„์ „์ด ๋˜์—ˆ์Œ์„ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋ณ€๊ฒฝ๋œ ๋ ˆ์ฝ”๋“œ [A,20]๋ฅผ ์ƒˆ๋กœ ์ž…๋ ฅํ•˜์—ฌ XMIN๊ฐ’์„ 2001๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
๐Ÿ“Œ PostgreSQL์—์„œ ๋ ˆ์ฝ”๋“œ์˜ ๋ณ€๊ฒฝ ์ž‘์—…(Update)์€ ๋‚ด๋ถ€์ ์œผ๋กœ ์‚ญ์ œ ํ‘œ์‹œ(Delete) → ๋ณ€๊ฒฝ ๊ฐ’ ์ž…๋ ฅ(Insert)์˜ ๋™์ž‘์œผ๋กœ ์ด๋ฃจ์–ด์ง‘๋‹ˆ๋‹ค.

 

์กฐํšŒ์‹œ์ ์— ๋”ฐ๋ฅธ ์ถ”์ถœ Data์˜ ๋ณ€ํ™”

์ด์ฒ˜๋Ÿผ ๋ฐ์ดํ„ฐ ์กฐ์ž‘ ์‹œ ๋ ˆ์ฝ”๋“œ ๋ณ„ ๋ฒ„์ „ ์ •๋ณด๋ฅผ XMIN๊ณผ XMAX๋กœ ๊ด€๋ฆฌํ•˜๋Š” ์ด์œ ๋Š”, ํ•ด๋‹น ๊ฐ’๊ณผ ์กฐํšŒ ์‹œ์ ์˜ Transaction ID (์ดํ•˜ XID) ๋น„๊ต๋ฅผ ํ†ตํ•ด ํŠน์ • ์‹œ์ ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”์ถœํ•˜๊ธฐ ์œ„ํ•จ์ž…๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด XID=2000์ธ ์‹œ์ ์— ์‹œ์ž‘๋˜์–ด ์˜ค๋ž˜ ์ˆ˜ํ–‰๋˜๋Š” Select SQL์ด ์žˆ๊ณ , ๊ฑฐ์˜ ๋™์‹œ์— ์‹œ์ž‘ํ•œ Update(XID=2001) SQL์ด ์žˆ๋‹ค๊ณ  ๊ฐ€์ •์„ ํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. Select SQL์ด ์‹ค์ œ ๋ ˆ์ฝ”๋“œ๋ฅผ ์ฐพ์•„๊ฐ„ ์ˆœ๊ฐ„์€ ์ด๋ฏธ Update๊ฐ€ ์™„๋ฃŒ๋œ ํ›„์ž…๋‹ˆ๋‹ค.

  1. [A,10] ๋ ˆ์ฝ”๋“œ๋Š” ์กฐํšŒ์‹œ์ ๋ณด๋‹ค ๊ณผ๊ฑฐ(XMIN=999)์— ์ž…๋ ฅ๋˜์—ˆ๊ณ  ๋ฏธ๋ž˜ ์‹œ์ (XMAX=2001)์— ์‚ญ์ œ๋  ์˜ˆ์ •์ž„์„ ์•Œ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์กฐํšŒ ๋Œ€์ƒ์— ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.
  2. ๋‘ ๋ฒˆ์งธ ๋ ˆ์ฝ”๋“œ์ธ [B,20]์€ ๋ณ€๊ฒฝ๋œ ์ด๋ ฅ์ด ์—†์œผ๋ฉฐ(XMAX=Null) ์ž…๋ ฅ๋œ ์‹œ์ (XMIN=1000)์ด ์กฐํšŒ ์‹œ์ž‘ ์‹œ์ ์ธ 2000๋ณด๋‹ค ๊ณผ๊ฑฐ์ด๋ฏ€๋กœ ์กฐํšŒ ๋Œ€์ƒ์— ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.
  3. ๋งˆ์ง€๋ง‰ ๋ ˆ์ฝ”๋“œ์ธ [A,20]์˜ ๊ฒฝ์šฐ ์กฐํšŒ์‹œ์ (2000)๋ณด๋‹ค ๋ฏธ๋ž˜(XMIN=2001)์— ์ž…๋ ฅ๋˜์—ˆ์œผ๋ฏ€๋กœ ๋Œ€์ƒ์— ํฌํ•จ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

 

ํ•ด๋‹น ๋ชจ๋ธ์˜ ๋ฌธ์ œ์ 

์ด์™€ ๊ฐ™์ด PostgreSQL์˜ MVCC๋ชจ๋ธ์€ ๋ ˆ์ฝ”๋“œ ๋ณ„ XID ๋น„๊ต๋ฅผ ํ†ตํ•ด ๋น„๊ต์  ์‰ฝ๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์žฅ์ ์€ ์žˆ์ง€๋งŒ ๋ฐ˜๋Œ€๋กœ ๋ช‡ ๊ฐ€์ง€ ์น˜๋ช…์ ์ธ ๋ฌธ์ œ์˜ ์›์ธ์ด ๋˜๊ธฐ๋„ ํ–ˆ์Šต๋‹ˆ๋‹ค.

๋Œ€ํ‘œ์ ์ธ ๋ฌธ์ œ๋กœ๋Š” ์•„๋ž˜ ๋‚ด์šฉ๊ณผ ๊ฐ™์ด ๊ณต๊ฐ„ ์‚ฌ์šฉ์˜ ๋น„ํšจ์œจ, ๊ทธ๋ฆฌ๊ณ  ๋ถ€์กฑํ•œ Transaction ID ๋“ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค. PostgreSQL์€ ์ด๋Ÿฌํ•œ ๋ฌธ์ œ์ ์„ ๋ณด์™„ํ•˜๊ธฐ ์œ„ํ•ด VM, Data Freezing, Age ๋“ฑ์˜ ๊ฐœ๋…์„ ๋งŒ๋“ค์–ด๋ƒˆ์œผ๋ฉฐ, ๊ถ๊ทน์ ์œผ๋กœ Vacuum์„ ์ด์šฉํ•˜์—ฌ ์ด๋Ÿฌํ•œ ์ผ๋ จ์˜ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ณ ์ž ํ–ˆ์Šต๋‹ˆ๋‹ค.

ํ…Œ์ด๋ธ” ๋‚ด๋ถ€์— ๋ณ€๊ฒฝ ์ด์ „ ๋ฒ„์ „(๋“ค)๊ณผ ํ˜„์žฌ ๋ฒ„์ „์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋ชจ๋‘ ์œ„์น˜์‹œํ‚ต๋‹ˆ๋‹ค.
๊ฐ ๋ ˆ์ฝ”๋“œ(row) ๋ณ„๋กœ 4 Byte ๋ฒ„์ „ ์ •๋ณด(XID)๋ฅผ ๋‘์–ด ์‹œ์ ์„ ์‹๋ณ„ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.

๋ฌธ์ œ์  1. ๊ณต๊ฐ„ ์‚ฌ์šฉ์˜ ๋น„ํšจ์œจ

  • Update, Delete๊ฐ€ ๋นˆ๋ฒˆํ•œ ํ…Œ์ด๋ธ”์— ๋Œ€ํ•ด์„œ๋Š” ๊ฐ ๋ฐ์ดํ„ฐ์˜ ์ด์ „ ๋ฒ„์ „์„ ๋ชจ๋‘ ์ €์žฅํ•ด์•ผ ํ•˜๋ฏ€๋กœ ๊ณต๊ฐ„ ๋น„ํšจ์œจ์ด ์ปค์ง€๋ฉฐ ์Šค์บ” ๋ฒ”์œ„๊ฐ€ ๋Š˜์–ด๋‚˜๋Š” ๋ถ€์ž‘์šฉ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋˜ํ•œ Oracle์ฒ˜๋Ÿผ Block ๋‹จ์œ„๊ฐ€ ์•„๋‹Œ ๋ ˆ์ฝ”๋“œ ๋‹จ์œ„์˜ XID ์ €์žฅ ๋ฐฉ์‹์€ ํŽ˜์ด์ง€ ๋‚ด๋ถ€์— ๋Œ€ํ•œ ๊ณต๊ฐ„ ๋น„ํšจ์œจ์„ ์•ผ๊ธฐํ•ฉ๋‹ˆ๋‹ค.

๋ฌธ์ œ์  2. XID ๋ถ€์กฑ ํ˜„์ƒ

  • ๋ ˆ์ฝ”๋“œ ๋ณ„ XID๊ฐ€ 4 Byte๋ผ๋Š” ์ ์˜ ๋˜ ๋‹ค๋ฅธ ๋ฌธ์ œ์ ์œผ๋กœ๋Š” 43์–ต ์ •๋„์˜ Transaction๋ฐ–์— ํ‘œํ˜„ํ•  ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
  • ์ด๋กœ ์ธํ•ด 43์–ต XID๋ฅผ Newer/Older ๊ตฌ์กฐ๋กœ ๋‚˜๋ˆ„์–ด ์ˆœํ™˜์‹์œผ๋กœ ์‚ฌ์šฉํ•˜๋ฉฐ(๋ชจ๋“ˆ๋กœ ์—ฐ์‚ฐ), ์˜ค๋ž˜๋œ XID์˜ ๊ฒฝ์šฐ ์ฃผ๊ธฐ์ ์œผ๋กœ ํŠน์ˆ˜ ๊ฐ’(Frozen XID) ์„ธํŒ…์„ ํ†ตํ•ด ์–ธ์ œ๋‚˜ ๊ฐ€์žฅ ์˜ค๋ž˜๋œ ๋ฐ์ดํ„ฐ์ž„์„ ํ‘œ์‹œํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ดํ›„ ๋ฌธ์„œ์—์„œ๋Š” XID, Age, Data Freezing, VM๋“ฑ์— ๋Œ€ํ•œ ๋‚ด์šฉ์„ ์ฐจ๋ก€๋Œ€๋กœ ์•Œ์•„๋ณธ ํ›„, Vacuum์˜ ๋™์ž‘์›๋ฆฌ์— ๋Œ€ํ•ด ์„ค๋ช…ํ•˜๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

 

๊ธฐํš ๋ฐ ๊ธ€ | ๊ธฐ์ˆ ๊ธฐํšํŒ€

์ด๋ฏธ์ง€ ์ œ์ž‘ | ๋””์ž์ธ๊ทธ๋ฃน ์ด๋ฏผ์„

 

 

 

๋Œ“๊ธ€2