PostgreSQL

Vaccum 란?

리거니 2022. 9. 22. 10:22

MVCC 로 인해 수많은 row가 쌓임으로써

디스크 I/O 및 성능저하와 같은 불편함이 생길 수 있다.

이와같이 불필요한 row에 대해서 어떻게 처리할까?

Vaccum (진공청소기 )

PostgreSQL의 쓰레기 데이터를 정리 (디스크 조각 모음)

# 필요성 #

○ 데이터는 물리적으로 디스크에 저장되고 읽어서 보여주는데,

데이터를 갱신 및 삭제시에도 기존 정보가 그대로 남아있다.

즉, 갱신된 데이터가 추가됨으로써 용량이 증가한다.

○ Why?

MVCC 구현에 따른 튜플로 인해

즉, 트랜잭션을 사용하기위해 기존 데이터를 변경하지않고 보관한다.

결국 디스크 I/O로 인해 성능 저하가 나타남.

하지만 !!!

Vaccum을 실행하면 불필요한(기존) 데이터가 정리됩니다 !!!

# 효과 #

○ PostgreSQL의 모든 정보는 Pg_Catelog에 쌓이고 있는데,

튜플에 대한 정보도 가지고 있으며 그 정보를 기반으로

쿼리 플랜(Query Plan)에도 활용 (성능 향상)

○ Index 적용 조회 속도 향상을 위해 실제 지도 갱신 필요

○ 트랜잭션 ID 겹침으로 인해 오래된 자료의 손실이 발생하는 것을 방지

○ 변경 또는 삭제된 자료들이 차지 하고있는 디스크 공간 확보

 


# 실행 #

○ full 옵션으로 실행 시 Lock(잠김)이 걸리므로, 운영중인 DB는 사용 X

-- DB 전체 풀 실행

vacuum full analyze;

-- DB 전체 간단하게 실행

vacuum verbose analyze;

-- 해당 테이블만 간단하게 실행

vacuum analyse [테이블 명];

-- 특정 테이블만 풀 실행

vacuum full [테이블명];

○ 실행후에도 OID는 변경 X

 

# 청소 기준 #

○ FSM (Free Space Map) 

○ 더이상 필요하지 않는 행의 정보 (사용되지 않는 용량)

○ 새로운 행이 삽입될때 DBMS는 FSM의 여유공간을 확인하여 해당 행 사용

# 참고 #

○ vaccum full 실행시 pg_class의 relfilenode 값이 변경됨

이 값은 디스크에 저장되는 파일명과 동일하며 아래 쿼리로

물리적인 파일의 위치를 찾을 수 있음.

SELECT oid, pg_relation_filepath(oid), relname, relfilenode FROM pg_class LIMIT 10;

 

# 기술 #

○ Vaccum Full

기본적인 동작인 공간 반환하여 삭제하는 동작에 더해서

단편화된 테이블,인덱스 를 압축 lock 모드로 수행

실시간으로 작업이 진행되고 운영되는 상황에서는 사용할 수 없음.

○ Vaccum Analyze

기본동작 + 통계 정보 갱신을위한 테이블 변동 정보수집

SELECT, INSERT만 발생되는 테이블에서는 자동수행 X

다만 MAX_AGE 수치(설정 가능) 가 넘어가면 강제 수행

○ Vaccum Freeze

오래된 txid와 현 txid가 1이라도 차이나면 기존 txid를 반환하는 명령어

이 반환된 txid는 Frozen txid 라고 함

txid를 재사용하므로 오래된 것들은 반환시켜야함

# 원리 (Normal) #

○ 다른 데이터가 저장되도록 Dead Row를 빈 공간으로 표시 (공간 감소 X)

○ 작업 시 FSM 과 VM 공간이 생긴다.

○ 여러 다른 작업들과 함께 사용가능

[FSM]

재사용 가능한 공간에 대한 정보가 갱신,

VM에는 각 블록에 대해 Dead row의 존재 여부를 표시

 

[VM]

인덱스 전용의 검색 성능 향상 목적

# 원리 (Full) #

○ 새 파일에 저장하는 방식

○ 앞 페이지로 rows를 이동시켜 테이블을 압축

○ 새로운 공간을 할당하여 공간 확보

○ 처리 속도가 매우 느리다.

○ Lock으로 인해 다른 작업이 불가 ( 중요 !! )