재학습/DB

[Postgresql] Vacuum 이란?

재이든 2021. 10. 20. 01:26
반응형

 

[Vacuum이란?]

Postgresql에서는 Vacuum 개념이 있다.

Vacuum개념을 설명하기위해서는 다른 선수개념들이 필요하므로 하나씩 짚어가고자 한다.

 

Postgres는 MVCC를 구현하기위한 튜플개념이 존재하는데,

쉽게말해 트랜잭션을 가능하게 하는것을 목적으로 하는 개념이다.

 

이 튜플은 Postgres에서 '데이터'이다.

데이터는 튜플형태로 저장된다고 보면된다.

 

그렇다면 다시 본론으로돌아와보자.

트랜잭션을 지원히기위해서 튜플형태로 저장되어있는 데이터의 Update/Delete연산은

기존의 데이터를 직접 가공하는 형태로 이루어지지않는다.

즉, 기존의 데이터는 그대로 저장해두고, 사용하지않는다는 표시를 한다.

 

이 부분은 조금 더 정확히 설명해볼 필요가 있다.

한 개념만 더 짚어보자, Postgres는 FSM의 개념이있다. (Free Space Map)

이 개념은 재사용 가능한 데이터를 표시하는 기능을 한다.

이 개념을 활용해서 데이터를 다룬다.

 

위의 예시처럼 Update/Delete의 경우를 살펴보자.

1.FSM의 빈 공간이 존재하는지 살피고, 없다면 추가할당을한다.

2.해당 공간에 변경될데이터(Update의 경우)를 삽입한다.

3.기존에 사용중이던데이터(Update또는 Delete될 타겟 데이터)의 포인터를 2번에서 삽입한 데이터로 변경을한다.

==> 그렇다면 이제 '기존에 사용중이던 데이터'에 집중을해보자.

이 데이터는 사용하지않는 데이터가 되어버린다. 

즉, 따라서 이 데이터는 Dead Tuple이다.

 

Update/Delete가 잦게 사용되어 Dead Tuple이 많아지게 된다면 성능하락이 생겨버린다.

1.데이터베이스 크기 자체가 비대해질 수 있다.

2.Select연산시 Disk I/O가 자주일어나 Select효율이 떨어질 수 있다.

(Select시 Disk에서 Chunk단위로 읽어 타겟 Live-Tuple을 찾는데, 

Dead-Tuple이 많으면 타겟 Live-Tuple을 찾기위해 더 많은 Disk I/O를 수행할것이기 때문) 

 

따라서 이런 DeadTuple을 정리해주는것이 Vacuum 기능이다.

 

[Vacuum의 종류]

Vacuum에는 AutoVacuum과 FullVacuum이 있다.

 

AutoVacuum

재사용을 위하여 DeadTuple의 위치를 FSM에 반환해주는 기능을 수행한다.

실제적인 데이터베이스 용량 축소는 없지만, 기존에 만들어진 DeadTuple들을 재활용해줄 수 있다.

기본적용이 되어있고, 어플리케이션의 특성에 맞게 커스텀이 가능하다.

(AutoVacuum이 동작하게되는 DeadTuple의 비율 등..)

 

FullVacuum

DeadTuple을 제거하고 FSM을 재구성하는 기능을 수행한다.

실제적인 데이터베이스 용량 축소가 이루어진다.

FullVacuum시에는 Table Lock이 발생되기때문에 서비스중인 어플리케이션의 DB에서는 주의하여야한다.

 

반응형