https://afsdzvcx123.tistory.com/entry/PostgreSQL-AutoVacuum-동작-테스트
https://nrise.github.io/posts/postgresql-autovacuum/
https://afsdzvcx123.tistory.com/entry/PostgreSQL-Autovacuum-최적화
Autovacuum?
Dead Tuple?
Autovacuum 최적화
Full Vacuum과 Autovacuum의 차이
autovacuum 테스트
<aside>
❓ AutoVacuum, Vacuum ( Full ) 에대해?
</aside>
- PostgreSQL 에는 Autovacuum, 혹은 Vacuum 이라는 개념이 존재합니다. Vacuum 과 관련된 설정들을 소홀히 하다가 데이터베이스의 트랜잭션이 증가하였을 때 예상밖의 느린 성능을 겪게 될 수 있습니다. 따라서 PostgreSQL 을 안정적으로 운용하기 위해서는 반드시 Autovacuum(Vacuum) 에 대해 이해할 필요가 있습니다.
- PostgreSQL에서 Autovacuum이 일어나는 상황 2가지
Dead Tuple이란 ?
- PostgreSQL에서 Data는 Tuple(row)이라고 불린다. 그리고 모든 tuple 은 live tuple, dead tuple 로 나뉘며, 더 이상 사용(참조)되지 않는 tuple 을 dead tuple 이라 부릅니다. dead tuple을 이용하여 MVCC를 구현한다.
- 만일 특정 column 혹은 row 를 업데이트하는 트랜잭션이 수행될 경우 PostgreSQL 은 MVCC 지원을 위해 다음과 같이 동작합니다.
- FSM 에 여유가 있는지 확인합니다. 없으면 FSM 을 추가적으로 확보합니다.
- FSM 의 빈 공간에 업데이트 될 데이터를 기록합니다. 이 떄 새로운 tuple 이 추가 됩니다.
- 기록이 완료되면, 기존 column(혹은 row) 를 가리키는 포인터를 새로 기록된 tuple 로 변경합니다.
- 업데이트 이전 정보가 기록된 공간은 더 이상 참조가 되지 않게 됩니다. 이 참조가 되지 않는 tuple 을 dead tuple 이라 부릅니다.
- dead tuple은 참조가 되지 않고 무의미하게 저장공간만 낭비하고 잇는 상태가 된다. 이런 dead tuple의 점유 공간을 정리하는 작업이 vaccum 작업이다.
- 정리하면 아래와 같다
- PostgreSQL는 dead tuple을 이용하여 MVCC를 구현
- dead tuple 을 정리하기 위해 Full Vacuum 이라는 task 가 만들어지게 되었습니다.
- Full Vacuum 은 수동으로 구동 됩니다. 그리고 Full Vacuum 이 수행중일 때 해당 테이블은 lock 이 걸리며 모든 트랜잭션이 거부됩니다.
- 위와 같은 이유로 테이블에 lock 을 걸지 않으면서 dead tuple 을 정리해 주는 Vacuum 명령어가 나오게 되었습니다. (단, 이 경우 dead tuple 의 정리 결과로 과다 사용된 저장 공간이 줄어들지는 않습니다.)
- 또한 Vacuum 을 정기적으로, 그리고 자동으로 vacuuming 을 수행하는 Autovacuum 이 만들어 지게 됩니다.