๐ข ๋ณธ ๋ฌธ์์์๋ Visibility Map (์ดํ VM)์ด๋ผ๋ ๋ฉํ ํ์ผ์ ๋ํ ๋ด์ฉ์ ๋ค๋ฃน๋๋ค. ์ฐ์ Vacuum์ ๊ธฐ์ค์ ๋ณด๋ก ํ์ฉํ๋ โ VM File์ด๋ ๋ฌด์์ธ์ง ์์๋ณด๊ณ , โก์ฌ์ฉ์ ์กฐ์์ ๋ฐ๋ผ ์ด๋ป๊ฒ ๋ณ๊ฒฝ๋๋ฉฐ, ์ด๋ป๊ฒ ๊ด์ฐฐํ ์ ์๋์ง ์์๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
Visibility Map
VM File์ด๋?
VM์ด๋ Heap Relation(*ํ ์ด๋ธ)์ ๊ตฌ์ฑํ๋ ๊ฐ๋ณ ํ์ด์ง์ ์ํ๋ฅผ 2๊ฐ์ Bit๊ฐ์ผ๋ก ํํํ๋ ๋ฉํ์ ๋ณด ํ์ผ์ด๋ฉฐ ํ์ด์ง๊ฐ ํฌํจํ๋ Tuple(Row)๋ค์ ์ํ ์ ๋ณด๋ฅผ ์ถ์ฝํด์ ๋ด๊ณ ์์ต๋๋ค.
VM ํ์ผ์ Relation OID์ ํด๋นํ๋ ์ซ์์ ์ ๋ฏธ์ด "_vm"์ ๋ถ์ธ ํํ๋ก ๊ด๋ฆฌ๋๋ฉฐ ์ฌ์ฉ์๊ฐ VACUUM
๋๋ VACUUM FREEZE์
๊ฐ์ ๋ช
์์ ์ธ Vacuum์์
์ ์ํํ๊ฑฐ๋ Autovacuum Launcher Process์ ์ํด Autovacuum ์ด ์ํ๋ ๋์๋ ๊ฐฑ์ ๋ฉ๋๋ค.
๐ PostgreSQL์์ Relation๊ณผ Page๋ ๊ฐ๊ฐ Table, Block์ ์๋ฏธํฉ๋๋ค
VM์ด ๊ด๋ฆฌํ๋ ์ ๋ณด
VM์ PostgreSQL 9.6 ์ด์ ๋ฒ์ ๊น์ง Data ํ์ด์ง ๋น 1 Bit์ Flag ๊ฐ์ ํตํด ALL_VISIBLE ์ ๋ณด๋ง์ ํํํ์์ต๋๋ค. ํ์ง๋ง ์ดํ ๋ฒ์ ๋ถํฐ ์ฑ๋ฅ ํฅ์์ ๋ชฉ์ ์ผ๋ก ํ์ด์ง ๋น 2 Bit๋ก ํ์ฅํ์ฌ ALL_FROZEN ์ ๋ณด๊น์ง ํํํ๊ณ ์์ต๋๋ค. ๊ฐ Bit๋ค์ด ๋ํ๋ด๋ ์๋ฏธ๋ ์๋์ ๊ฐ์ต๋๋ค.
1st Bit : ALL_VISIBLE
ํ์ด์ง์ ํฌํจ๋ Row๊ฐ ๋ชจ๋ Transaction์ ๋ณด์ด๋ ์ํ์ธ์ง ์ฌ๋ถ (Boolean)๋ฅผ ๋ํ๋ด๋ฉฐ, Dead Tuple(Row)์ ์กด์ฌ ์ฌ๋ถ๋ฅผ ์ ์ ์์ต๋๋ค.
์ด๋, ALL_VISIBLE=1(True)์ธ ๊ฒฝ์ฐ๋ผ๋ฉด ํด๋น ํ์ด์ง์ ๋ชจ๋ Row๊ฐ Visible ํ์ํ๋ก, Dead Tuple์ด ์๋ ์ํ๋ฅผ ์๋ฏธํ์ง๋ง, 0(False)์ธ ๊ฒฝ์ฐ๋ผ๋ฉด Dead Tuple์ด ์กด์ฌํ๊ฑฐ๋, ์์ง Vacuum์ด ์ํ๋์ง ์์ ๋ชจ๋ฅด๋ ์ํ๊น์ง ํฌํจ๋ฉ๋๋ค.
๐ PostgreSQL์์ Row(Tuple)์ Live ์ํ์ Dead ์ํ๋ก ๋๋๋ฉฐ, Update/Delete๋ฑ์ ์ํด ๋ ์ด์ ์ฐธ์กฐ๋์ง ์์ Tuple์ Dead Tuple์ด๋ผ ๋ถ๋ฆ ๋๋ค.
2nd Bit : ALL_FROZEN
ALL_VISIBLE ๊ฐ์ด True์ธ ๊ฒฝ์ฐ์๋ง ํด๋น์ฌํญ์ด ์์ผ๋ฉฐ, ํ์ด์ง์ ํฌํจ๋ ๋ชจ๋ Row๊ฐ Freeze ๋์๋์ง ์ฌ๋ถ (Boolean)๋ฅผ ํํํฉ๋๋ค.
๐ Freeze๋ Frozen XID๋ผ๋ ํน์ํ XID๋ฅผ ๋ถ์ฌํ๋ ์์ ์ ๋งํฉ๋๋ค.
2 Bit๊ฐ์ผ๋ก ์ด๋ฃจ์ด์ง VM์ ๋ค์๊ณผ ๊ฐ์ ๋ชฉ์ ์ผ๋ก ์ฌ์ฉ๋ฉ๋๋ค.
- VACUUM Performance : Vacuum์ํ ์ ALL_VISIBLE ๊ฐ์ด False์ธ ํ์ด์ง๋ง ๋์์ผ๋ก ํ๊ธฐ ๋๋ฌธ์ ๋ถํ์ํ ํ์ด์ง์ ๋ํ ์ ๊ทผ์ ์ค์์ผ๋ก์จ Vacuum์ฑ๋ฅ ํฅ์
- Freezing Performance : Transaction ID Wraparound๋ฅผ ํผํ๊ธฐ ์ํด Row๋ค์ Freezing ํ๋ ์์ ์ ๊ฒฝ์ฐ ALL_FROZEN ๊ฐ์ด True ์ธ ํ์ด์ง๋ฅผ Skip ํ๋ฏ๋ก ์์ ์๊ฐ์ด ๋จ์ถ๋จ
- Query Performance : Index Only Scan์ (Covering Index) ๋์ ํ์ด์ง์ ALL_VISIBLE ๊ฐ์ด True ์ธ ๊ฒฝ์ฐ Table Look-up์ ํผํ ์ ์์ผ๋ฏ๋ก SQL์ ์ฑ๋ฅ ํฅ์
๐ ์ํ๊น๊ฒ๋ PostgreSQL์์ Index Only Scan์ ์ ๋ํ๊ธฐ ์ํ ์ ์ ํ ๊ตฌ์ฑ์ ํ์๋๋ผ๋ Table Look-up์ด ๋ฐ์ํ ์ ์์ต๋๋ค. ์ด๋ ์ฝ์ด์ผ ํ , ํน์ ์ฝ์ง ๋ง์์ผ ํ Row์ธ์ง๋ฅผ ํ๋จํ ์ ๋ณด๊ฐ Index ์์ฒด์ ์กด์ฌํ์ง ์๊ธฐ ๋๋ฌธ์ ๋๋ค. PostgreSQL์์๋ ์ด๋ฌํ ๋ฌธ์ ๋ฅผ ํผํ๊ธฐ ์ํด SQL ์ํ ์์ ์ VM์ ALL_VISIBLE ๊ฐ์ ํ์ธํ์ฌ Table Look-up์ฌ๋ถ๋ฅผ ๊ฒฐ์ ํ๊ฒ ๋ฉ๋๋ค.
VM์ ๋ณํ์ ๊ด์ฐฐ
pg_visibility
VM์ 2 Bit๊ฐ์ pg_visibility๋ผ๋ Extension์ ํตํด ํ์ธํ ์ ์์ต๋๋ค. pg_visibility('relation name')
ํํ๋ก ์ฌ์ฉ์ด ๊ฐ๋ฅํฉ๋๋ค.
create table test_vm (c integer) ;
insert into test_vm select generate_series(1,1001) as c;
SELECT blkno, all_visible, all_frozen FROM pg_visibility('test_vm');
blkno | all_visible | all_frozen |
-------+-------------+------------+
0 | f | f |
1 | f | f |
2 | f | f |
3 | f | f |
4 | f | f |
(5 rows)
-- Freezing ์์
์ํ
vacuum freeze test_vm
SELECT blkno, all_visible, all_frozen FROM pg_visibility('test_vm');
blkno | all_visible | all_frozen |
-------+-------------+------------+
0 | t | t |
1 | t | t |
2 | t | t |
3 | t | t |
4 | t | t |
(5 rows)
VM์ ๋ณํ
pg_visibility๋ฅผ ํตํด ๊ด์ฐฐ ๊ฐ๋ฅํ VM์ 2 Bit๊ฐ์ DML ๋ฐ Vacuum ๊ด๋ จ ์์ ์ ์๋ ๊ทธ๋ฆผ๊ณผ ๊ฐ์ด ๋ณํํ๋ฉฐ, ์๋์ ๊ฐ์ ํน์ง์ ๊ฐ์ต๋๋ค.
- Vacuum ๊ด๋ จ ์์ ์ ์ํํ์ง ์์ ์ต์ด ์์ฑ๋ ํ์ด์ง์ VM ๊ฐ์ [0,0]์ ๋๋ค
- Vacuum ๊ด๋ จ ์์ ์ ์ํํ ์ดํ ํ์ด์ง์ VM ๊ฐ์ [1,0] ๋๋ [1,1]์ ๋๋ค.
- Vacuum Freeze ์์ ์ ์ด์ ์ํ์ ๊ด๊ณ์์ด [1,1]์ VM ์ํ๊ฐ ๋ฉ๋๋ค.
- DML ์ํ ์ ์ด์ ์ํ์ ๊ด๊ณ์์ด [0,0]์ VM ์ํ๊ฐ ๋ฉ๋๋ค.
- Vacuum Full ์ํ ์ ์ด์ ์ํ์ ๊ด๊ณ์์ด [0,0]์ VM ์ํ๊ฐ ๋ฉ๋๋ค. (์ฌ๊ตฌ์ฑ)
VM์ ๋ง์ง๋ง์ผ๋ก Vacuum์ ์ดํดํ๊ธฐ ์ํ ๊ธฐ๋ฐ ์ง์๋ค์ ๋ํ ์ ๋ฆฌ๋ฅผ ๋ง๋ฌด๋ฆฌํ๋ฉฐ, ๋จ์ ๋ฌธ์๋ค์์๋ ์ค์ Vacuum ๋ฐ Autovacuum์ ๋์ ๊ณผ์ ์ ๋ํด ๋ค๋ฃจ๋๋ก ํ๊ฒ ์ต๋๋ค.
๊ธฐํ ๋ฐ ๊ธ | ๊ธฐ์ ๊ธฐํํ
์ด๋ฏธ์ง ์ ์ | ๋์์ธ๊ทธ๋ฃน ์ด๋ฏผ์
'์์ ๊ฒฝ์๋ ฅ > DB ์ธ์ฌ์ด๋' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
DB ์ธ์ฌ์ด๋ | PostgreSQL Vacuum - 6. Autovacuum (4) | 2022.04.29 |
---|---|
DB ์ธ์ฌ์ด๋ | PostgreSQL Vacuum - 5. Manual Vacuum (0) | 2022.04.29 |
DB ์ธ์ฌ์ด๋ | PostgreSQL Vacuum - 3. Age (0) | 2022.04.29 |
DB ์ธ์ฌ์ด๋ | PostgreSQL Vacuum - 2. Transaction ID (0) | 2022.04.29 |
DB ์ธ์ฌ์ด๋ | PostgreSQL Vacuum - 1. MVCC (2) | 2022.04.29 |
๋๊ธ0