본문 바로가기
다른 DBMS/PostgresDB

vacuum 과 vacuum full 차이 보기 (pageinspect extention 사용)

by 취미툰 2024. 3. 31.
반응형

지난시간에 제가 설치하려고 했던 extension입니다.

이걸 사용해서 vacuum과 vacuum full 했을때 어떤 차이가 있는지 확인해보겠습니다.

 

테스트 테이블

data 컬럼하나만 있는 tbl1을 생성하고 A 하나를 insert합니다.

postgres=# create table tbl1 (data text);
CREATE TABLE
postgres=*# insert into tbl1 values ('A');
INSERT 0 1

 

 

확인

postgres=# SELECT lp as tuple, t_xmin, t_xmax, t_field3 as t_cid, t_ctid
postgres-# FROM heap_page_items( get_raw_page('tbl1',0)) ;
 tuple | t_xmin | t_xmax | t_cid | t_ctid
-------+--------+--------+-------+--------
     1 |    804 |      0 |     0 | (0,1)
(1 row)

 

 

delete후  확인

데이터는 삭제되었지만 tuple은 남아있음.

postgres=# delete from tbl1;
DELETE 1

postgres=# SELECT lp as tuple, t_xmin, t_xmax, t_field3 as t_cid, t_ctid
postgres-# FROM heap_page_items( get_raw_page('tbl1',0)) ;
 tuple | t_xmin | t_xmax | t_cid | t_ctid
-------+--------+--------+-------+--------
     1 |    804 |    805 |     0 | (0,1)
(1 row)

 

다시 INSERT 하고 UPDATE 여러번 하기

실제data는 C이지만 앞에 tuple이 1,2,3으로 dead tuple이 생성된것을 볼 수 있다.

postgres=# insert into tbl1 values ('A');
INSERT 0 1
postgres=# update tbl1 set data='B';
UPDATE 1
postgres=# update tbl1 set data='C';
UPDATE 1

postgres=# SELECT lp as tuple, t_xmin, t_xmax, t_field3 as t_cid, t_ctid
           FROM heap_page_items( get_raw_page('tbl1',0)) ;
 tuple | t_xmin | t_xmax | t_cid | t_ctid
-------+--------+--------+-------+--------
     1 |    804 |    805 |     0 | (0,1)  -----이건 dead tuple
     2 |    806 |    807 |     0 | (0,3)   --insert 'A'  --dead tuple
     3 |    807 |    808 |     0 | (0,4)   --update 'B'  --dead tuple
     4 |    808 |      0 |     0 | (0,4)   --update 'C' 
(4 rows)

postgres=# select * from tbl1;
 data
------
 C
(1 row)

 

vacuum 수행 후 확인

마지막 4번 tuple만 데이터가 남아있고 나머지는 없어졌다. 하지만 delete 개념으로 1,2,3의 자리는 그대로 남아있다.

다시 update하면 이곳에 tx데이터가 update된다.

postgres=# vacuum tbl1;
VACUUM

postgres=# SELECT lp as tuple, t_xmin, t_xmax, t_field3 as t_cid, t_ctid
postgres-#            FROM heap_page_items( get_raw_page('tbl1',0)) ;
 tuple | t_xmin | t_xmax | t_cid | t_ctid
-------+--------+--------+-------+--------
     1 |        |        |       |
     2 |        |        |       |
     3 |        |        |       |
     4 |    808 |      0 |     0 | (0,4)
(4 rows)

 

vacuum full 수행 후 확인

tuple이 최신것만 남기고 공간이 반환되었다.

postgres=# vacuum full tbl1;
VACUUM
postgres=# SELECT lp as tuple, t_xmin, t_xmax, t_field3 as t_cid, t_ctid
           FROM heap_page_items( get_raw_page('tbl1',0)) ;
 tuple | t_xmin | t_xmax | t_cid | t_ctid
-------+--------+--------+-------+--------
     1 |    808 |      0 |     0 | (0,1)
(1 row)

 

***vacuum 후 빈 공간 재활용 여부 체크

update tbl1 set data='D';
update tbl1 set data='E';
update tbl1 set data='F';
update tbl1 set data='G';
update tbl1 set data='H';
update tbl1 set data='I';
update tbl1 set data='J';


 tuple | t_xmin | t_xmax | t_cid | t_ctid
-------+--------+--------+-------+--------
     1 |    808 |    811 |     0 | (0,2)
     2 |    811 |    812 |     0 | (0,3)
     3 |    812 |    813 |     0 | (0,4)
     4 |    813 |    814 |     0 | (0,5)
     5 |    814 |    815 |     0 | (0,6)
     6 |    815 |    816 |     0 | (0,7)
     7 |    816 |    817 |     0 | (0,8)
     8 |    817 |      0 |     0 | (0,8)
(8 rows)

 

Vacuum 수행

postgres=# vacuum tbl1;
VACUUM

 

2번 tuple에 새로운 정보가 쓰여진다.

postgres=# update tbl1 set data='Z';
UPDATE 1
postgres=# SELECT lp as tuple, t_xmin, t_xmax, t_field3 as t_cid, t_ctid
           FROM heap_page_items( get_raw_page('tbl1',0)) ;
 tuple | t_xmin | t_xmax | t_cid | t_ctid
-------+--------+--------+-------+--------
     1 |        |        |       |
     2 |    818 |      0 |     0 | (0,2)
     3 |        |        |       |
     4 |        |        |       |
     5 |        |        |       |
     6 |        |        |       |
     7 |        |        |       |
     8 |    817 |    818 |     0 | (0,2)
(8 rows)

 

끝.

반응형

댓글