๐ข ๋ณธ ๋ฌธ์์์๋ XID์ ์ฐ์ฅ์ ์์ ์๋ Age์ ๋ํด ์์๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค. โ Age์ ๊ฐ๋ ๊ณผ ๋์ ๋ฐฐ๊ฒฝ์ ์ฐ์ ํ์ธํ ํ, โกTable ๋ฐ Row์์ ์ฌ์ฉ๋๋ Age์ ์๋ฏธ์ ์ฐจ์ด์ ์ ๋ํด ์์๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
Age ๋?
Age = Current XID - ์์ฑ์์ ์ XID
์์ Data Freezing๊ณผ์ ์ ์ค๋ช
ํ๋ฉฐ “Current XID - ์์ฑ(์
๋ ฅ) ์์ ์ XID” ๊ฐ์ด 21์ต์ ์ด๊ณผํ๊ธฐ ์ ์ Frozen XID
๋ก ๋ณ๊ฒฝ๋ผ์ผ XID Wraparound ์ํฉ์ ํผํ ์ ์๋ค๊ณ ์ด์ผ๊ธฐํ์ต๋๋ค.
์ด์ฒ๋ผ Data Freezing ๋์์ ์ ์ ํ๊ธฐ ์ํด์๋ XID๊ฐ ๊ทธ ์์ฒด๋ณด๋ค๋ ์ ๋ ฅ(์์ฑ) ํ ์ผ๋ง๋ ์ค๋๋์๋์ง ์ธก์ ํ ๋ฐฉ๋ฒ์ด ํ์ํด์ก์ผ๋ฉฐ ์ด๋ฅผ ์ํ ๊ฐ๋ ์ผ๋ก Age๊ฐ ๋์ ๋์์ต๋๋ค.
Age์ ํน์ง์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- Age ์ธก์ ์ ๋์์ DB / Table / Row์ด๋ค.
- Object ์์ฑ ์์ ์ Age๋ 1์ด๋ค.
- Row ์ ๋ ฅ ์์ ์ Age๋ 1์ด๋ค.
- ํธ๋์ญ์ ๋ฐ์ ์ ๊ฐ๊ฐ์ Age๋ ์ฆ๊ฐํ๋ค.
- Object์ Age๋ Row์ Age์ ๊ฐ๊ฑฐ๋ ํฌ๋ค.
- Age๊ฐ ํฐ Object ๋ฐ Row๋ Vacuum์ ๋์์ด ๋๋ค.
- Vacuum ์ํ ํ Age๋ ๋ฎ์์ง๋ค.
Table๊ณผ Row์ Age๋ age
ํจ์๋ฅผ ์ด์ฉํ์ฌ ๊ณ์ฐ์ด ๊ฐ๋ฅํ๋ฐ, ์ด๋ ๊ฒ ๊ณ์ฐ๋๋ Age๋ Vacuum์ ๋์์ ์ ์ ํ๊ฑฐ๋ ๋ด๋ถ์ ์ธ ๋์ ๋ฐฉ์์ ๊ฒฐ์ ํ๋๋ฐ ๊ธฐ์ค์ ์ญํ ์ ํฉ๋๋ค. Age๋ฅผ ์ด์ฉํ ๋ด๋ถ ๋์ ๊ณผ์ ์ ๊ดํด์๋ ์ดํ Manual Vacuum๊ณผ์ ์ ํตํด ๋ณด๋ค ์์ธํ ์์๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
Table๊ณผ Row์ Age
Age๊ฐ๋ ์ XID์ ๋ถ๋ฆฌํด์ ์๊ฐํ ์ ์์ต๋๋ค. Age ์์ฒด๊ฐ ์์ฑ ์์ ์ XID์ Current XID์ ์ฐจ์ด๋ฅผ ์๋ฏธํ๊ธฐ ๋๋ฌธ์ธ๋ฐ, ๊ฐ์ ์ด์ ๋ก Age๊ฐ ์ฌ์ฉ๋๋ ๊ณณ ์ญ์ XID์ ๋์ผํ Database, Table, Row์ ๋๋ค. ์ด ์ค Row์ Age์ ๋ํด ๋จผ์ ์์๋ณด๊ฒ ์ต๋๋ค.
Row Age
--Row(Tuple) Age
insert into age_table values(1);
insert into age_table values(2);
insert into age_table values(3);
select age(xmin),
txid_current() as current_xid,
xmin,
c1
from age_Table;
age|current_xid|xmin |c1|
---+-----------+--------+--+
3| 19314384|19314381| 1|
2| 19314384|19314382| 2|
1| 19314384|19314383| 3|
Row์ Age๋ XMIN
์ ์ด์ฉํ์ฌ ๊ณ์ฐํ ์ ์์ต๋๋ค.
์ ์์ ์์ ๋ฐ์ดํฐ ์
๋ ฅ ์์ ์ XID๊ฐ XMIN
์ผ๋ก ์ค์ ๋๋๋ฐ, XMIN
์ Age
ํจ์๋ฅผ ์ ์ฉํ๋ฉด Row์ Age๋ฅผ ๊ณ์ฐํ ์ ์์ต๋๋ค.
"Row" ๊ทธ ์์ฒด๋ Data Freezing์ ๋์์ด์ง๋ง "Row์ Age"๋ Data Freezing์ ๊ธฐ์ค์ด ๋ฉ๋๋ค. ๋ฐ์ดํฐ ์
๋ ฅ ํ Transaction์ด ๋ฐ์ํ ์๋ก Row์ Age ์ญ์ ์ฆ๊ฐํ๊ธฐ ๋ง๋ จ์ด๋ฉฐ, Row์ Age๊ฐ VACUUM_FREEZE_MIN_AGE
์์น์ ๋๋ฌํ๋ฉด Data Freezing์ ๋์์ด ๋ฉ๋๋ค. ์ดํ Vacuum์์
์ ์ค์ Data Freezing์ด ๋ฐ์ํฉ๋๋ค.
๐ vacuum_freeze_min_age
Vacuum์ด Freeze ํ Row์ ์ต์ Age์ด๋ฉฐ, ๊ธฐ๋ณธ๊ฐ์ 5์ฒ๋ง(50,000,000)์ ๋๋ค.
์ด๋ฌํ Data Freezing์์
์ 9.4 ๋ฒ์ ์ด์ ๊น์ง๋ ์ค์ XMIN
๊ฐ์ Frozen XID
๋ก ๋ณ๊ฒฝํ๋ ๋ฐฉ์์ผ๋ก ๋์ํ์ต๋๋ค. ํ์ง๋ง 9.4 ๋ฒ์ ๋ถํฐ๋ XMIN
์ ์ง์ ๋ณ๊ฒฝํ๋ ๋์ t_infomask
์ 10๋ฒ์งธ Bit๊ฐ์ 1๋ก ๋ณ๊ฒฝํ๋ ๋ฐฉ์์ผ๋ก ๋ณ๊ฒฝ๋์์ต๋๋ค.
VACUUM FREEZE
๋ช
๋ น์ ํตํด ๊ฐ์ ๋ก Data Freezing์ ๋ฐ์์ํจ ํ ๋ณํ๋ฅผ ์ดํด๋ณด๊ฒ ์ต๋๋ค. ๋ช
๋ น์ด ์ํ ํ XMIN
๊ฐ์ ๋ณ๊ฒฝ์ ์์ง๋ง t_infomask
๊ฐ์ ๋ณ๊ฒฝ๋ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค.
select * from heap_page_items(get_raw_page('age_table', 0))
lp|lp_off|lp_flags|lp_len|**t_xmin** |t_xmax|t_field3|t_ctid|t_infomask2|**t_infomask**|t_hoff|t_bits|t_oid|t_data|
--+------+--------+------+--------+------+--------+------+-----------+----------+------+------+-----+------+
1| 8160| 1| 28|**19314381**|0 | 0|(0,1) | 1| **2304**| 24| | | |
2| 8128| 1| 28|**19314382**|0 | 0|(0,2) | 1| **2304**| 24| | | |
3| 8096| 1| 28|**19314383**|0 | 0|(0,3) | 1| **2304**| 24| | | |
vacuum freeze age_table;
select * from heap_page_items(get_raw_page('age_table', 0))
lp|lp_off|lp_flags|lp_len|**t_xmin** |t_xmax|t_field3|t_ctid|t_infomask2|**t_infomask**|t_hoff|t_bits|t_oid|t_data|
--+------+--------+------+--------+------+--------+------+-----------+----------+------+------+-----+------+
1| 8160| 1| 28|**19314381**|0 | 0|(0,1) | 1| **2816**| 24| | | |
2| 8128| 1| 28|**19314382**|0 | 0|(0,2) | 1| **2816**| 24| | | |
3| 8096| 1| 28|**19314383**|0 | 0|(0,3) | 1| **2816**| 24| | | |
๐ ์ ์์ ๋ pageinspect Extension์ ์ค์นํด์ผ ํ์ธ์ด ๊ฐ๋ฅํฉ๋๋ค.
[PostgreSQL: Documentation: 14: F.23. pageinspect]
ํด๋น t_infomask
๊ฐ์ Bit๊ฐ์ผ๋ก ๋ณํํด๋ณด๋ฉด ์๋์ ๊ฐ์ด 10๋ฒ์งธ Bit๊ฐ 0์์ 1๋ก ๋ณ๊ฒฝ๋๋ฉด์ ์ค์ Data Freezing์ด ๋ฐ์ํ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค.
select 2304::bit(16) as before, 2816::bit(16) as after
before |after |
----------------+----------------+
0000100100000000|0000101100000000|
Table Age
์ด๋ฒ์๋ Table์ Age์ ๋ํด ์์๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค. Table์ Age๋ pg_class.relfrozenxid
๋ฅผ ์ด์ฉํด ๊ณ์ฐํ ์ ์์ต๋๋ค.
--Object(Table) Age
create table age_table (c1 integer);
select age(relfrozenxid) as age,
txid_current() as current_xid,
relfrozenxid as created_xid
from pg_class where relname ='age_table';
age|current_xid|created_xid|
---+-----------+-----------+
1| 19314370|19314369 |
Object์ Age๋ Row์ Age์ ๊ฐ๊ฑฐ๋ ํฌ๋ค. (์ค๋๋๋ค)
Row์ ๋ฌ๋ฆฌ Table์ Freezing ๋์์ด ์๋๋ฉฐ ๋์์ผ ํ์๋ ์์ต๋๋ค. ๊ทธ๋ ๋ค๋ฉด, Freezing์ ๋์๋ ์๋ Table์ Age๊ฐ ์ ํ์ํ์ง ๋๊ตฐ๊ฐ์๊ฒ ์๋ฌธ์ด ๋ ์๋ ์์ต๋๋ค. ํ์ง๋ง ์์ ๊ฐ์ Age์ ํน์ฑ์ผ๋ก ์ธํด, Table์ Age๋ Row๋ค์ Age๋ฅผ ๋ํํ๋ ์ญํ ์ด ๊ฐ๋ฅํ๋ฉฐ, ์ด๋ Data Freezing์ ํ์๋ก ํ๋ Row์ ์กด์ฌ ์ฌ๋ถ๋ฅผ ์์ฝ๊ฒ ํ๋จํ ์ ์๋ ๊ธฐ์ค์ผ๋ก์ ๊ทธ ๊ฐ์น๊ฐ ์์ต๋๋ค.
์ฌ์ค, Table์ Age๊ณ์ฐ์ ์ฌ์ฉ๋๋ relfrozenxid
์ญ์ ํน์ ์กฐ๊ฑด ๋ง์กฑ ์ ๊ทธ ๊ฐ์ด ๋ณ๊ฒฝ๋ ์ ์์ผ๋ฉฐ, ์ด๋ก ์ธํด Table์ Age ์ญ์ ๋ฎ์์ง ์ ์์ต๋๋ค. ์ด๋์ ์กฐ๊ฑด์ด๋ ์ ์ฒด ํ
์ด๋ธ์ ๋ํ Data Freezing ํ์ ์ฌ๋ถ๋ฅผ ๋ชจ๋ ํ์ธํ ์์ ์ ์ผ์ปซ๋๋ฐ, ํด๋น ๋ด์ฉ์ ์ดํด๋ฅผ ์ํด์๋ Eager Mode์ Vacuum ๋์์ ๋ํ ์ดํด๊ฐ ํ์ํ๋ฏ๋ก, ์ดํ Manual Vacuum ๊ณผ์ ์ ํตํด ๋ค์ ํ๋ฒ ์ธ๊ธํ๋๋ก ํ๊ฒ ์ต๋๋ค.
์ง๊ธ๊น์ง PostgreSQL์ MVCC๋ชจ๋ธ์ ์์์ผ๋ก Transaction ID, Age ๋ฑ XID๊ด๋ จ ๋ด์ฉ์ ๋ค๋ค๋๋ค. ๋ค์ ๋ฌธ์์์๋ Vacuum์ ๋์ ๋ฐฉ์์ ์ดํดํ๊ธฐ ์ํด ๊ผญ ํ์ํ Visibility Map์ ๋ํด ์์๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
๊ธฐํ ๋ฐ ๊ธ | ๊ธฐ์ ๊ธฐํํ
์ด๋ฏธ์ง ์ ์ | ๋์์ธ๊ทธ๋ฃน ์ด๋ฏผ์
'์์ ๊ฒฝ์๋ ฅ > DB ์ธ์ฌ์ด๋' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
DB ์ธ์ฌ์ด๋ | PostgreSQL Vacuum - 5. Manual Vacuum (0) | 2022.04.29 |
---|---|
DB ์ธ์ฌ์ด๋ | PostgreSQL Vacuum - 4. Visibility Map (0) | 2022.04.29 |
DB ์ธ์ฌ์ด๋ | PostgreSQL Vacuum - 2. Transaction ID (0) | 2022.04.29 |
DB ์ธ์ฌ์ด๋ | PostgreSQL Vacuum - 1. MVCC (2) | 2022.04.29 |
DB ์ธ์ฌ์ด๋ | PostgreSQL Architecture - 4. ๋์ ์๋ฆฌ (0) | 2022.04.27 |
๋๊ธ0