๐ข 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๋ชจ๋ธ์์ ์ฌ์ฉ์์ ๋ฐ์ดํฐ ์ฝ๊ธฐ ๊ณผ์ ์ด ์ด๋ค ์์ผ๋ก ๋์ํ๋์ง ํ์ธํด๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
ํ์ด์ง ๋ด๋ถ์ ๋ณํ
- XID=999 ์์ ์ [A,10] ๊ฐ์ Insert ํ์ต๋๋ค. ์ด๋ ๋ ์ฝ๋์ [XMIN, XMAX] ๊ฐ์ [999, Null]๋ก ์ค์ ๋ฉ๋๋ค
- XID=1000 ์์ ์ [B,20] ๊ฐ์ Insert ํ์ต๋๋ค. ์ด๋ ๋ ์ฝ๋์ [XMIN, XMAX] ๊ฐ์ [1000, Null]๋ก ์ค์ ๋ฉ๋๋ค
- ์๊ฐ์ด ํ๋ฌ 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๊ฐ ์๋ฃ๋ ํ์ ๋๋ค.
- [A,10] ๋ ์ฝ๋๋ ์กฐํ์์ ๋ณด๋ค ๊ณผ๊ฑฐ(XMIN=999)์ ์ ๋ ฅ๋์๊ณ ๋ฏธ๋ ์์ (XMAX=2001)์ ์ญ์ ๋ ์์ ์์ ์ ์ ์์ผ๋ฏ๋ก ์กฐํ ๋์์ ํฌํจ๋ฉ๋๋ค.
- ๋ ๋ฒ์งธ ๋ ์ฝ๋์ธ [B,20]์ ๋ณ๊ฒฝ๋ ์ด๋ ฅ์ด ์์ผ๋ฉฐ(XMAX=Null) ์ ๋ ฅ๋ ์์ (XMIN=1000)์ด ์กฐํ ์์ ์์ ์ธ 2000๋ณด๋ค ๊ณผ๊ฑฐ์ด๋ฏ๋ก ์กฐํ ๋์์ ํฌํจ๋ฉ๋๋ค.
- ๋ง์ง๋ง ๋ ์ฝ๋์ธ [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์ ๋์์๋ฆฌ์ ๋ํด ์ค๋ช ํ๋๋ก ํ๊ฒ ์ต๋๋ค.
๊ธฐํ ๋ฐ ๊ธ | ๊ธฐ์ ๊ธฐํํ
์ด๋ฏธ์ง ์ ์ | ๋์์ธ๊ทธ๋ฃน ์ด๋ฏผ์
'์์ ๊ฒฝ์๋ ฅ > DB ์ธ์ฌ์ด๋' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
DB ์ธ์ฌ์ด๋ | PostgreSQL Vacuum - 3. Age (0) | 2022.04.29 |
---|---|
DB ์ธ์ฌ์ด๋ | PostgreSQL Vacuum - 2. Transaction ID (0) | 2022.04.29 |
DB ์ธ์ฌ์ด๋ | PostgreSQL Architecture - 4. ๋์ ์๋ฆฌ (0) | 2022.04.27 |
DB ์ธ์ฌ์ด๋ | PostgreSQL Architecture - 2. Physical Structure (0) | 2022.04.27 |
DB ์ธ์ฌ์ด๋ | PostgreSQL Architecture - 5. SQL ์ฒ๋ฆฌ ๊ณผ์ (0) | 2022.04.27 |
๋๊ธ2