Vacuum
사전적의미로 청소, 진공, 공백을 의미합니다.
PostgreSQL 에서 Vacuum 은 MVCC 에 의해 현재 사용되지 않는 이전의 저장된 값들을 정리합니다.
Vacuum 을 하는 이유
PostgreSQL 은 MVCC 에 의해 이전의 값들이 갱신되거나 삭제되더라도
새로운 데이터로 추가(갱신 경우)하고 기존의 데이터는 정리하지 않고 삭제표기만 남겨둡니다.
이렇게 사용하지 않는 값들로 인해 파일 사이즈가 커져 성능저하가 발생하게 되는걸 방지합니다.
Transaction ID 가 겹침으로 인해 자료의 손실이 발생하는 것을 방지합니다.
이전의 데이터가 정리되면서 실행계획에서 사용할 통계치 정보를 최신으로 갱신해 줍니다.
Visibility MAP ( VM = Dead Tuple 의 존재 여부를 표기 ) 의 정보를 갱신해 줍니다.
Vacuum 이 수행되는 유형
테이블 / 데이터베이스 단위로 Vacuum 을 실행할 수 있습니다.
표준(간단하게)으로 실행하는 방식
1. Vacuum 이 실행 될 때에서 조회, 삭제, 갱신, 적재 등이 가능합니다.
2. 이전의 값들이 위치한 주소를 사용 가능하다라고 표시해주는 Free Space Map ( FSM ) 에 매핑합니다.
3. 이전 Vacuum 작업 이후부터 변경된 내용만을 대상으로 진행합니다.
2건의 INSERT 를 적재하면 들어온 순서대로 Page 에 Tuple 이 저장됩니다.
그리고 라인 포인터에서 이 튜플을 가리킵니다.
처음에 적재한 값을 Update 했습니다.
기존의 데이터는 그대로 둔 채로 튜플을 새로 생성, 기존의 포인트는 xmax 값을 변경, 라인포인터는 새로운 튜플을 가리키도록 합니다.
이 때 표준 Vacuum 을 실행합니다.
이전의 값을 가리키던 라인포인터는 삭제하였고 포인터의 위치도 앞으로 당겨졌습니다.
그러나 이전의 값을 지우지는 않으며 대신 FSM 에 이 공간을 사용할 수 있다고 매핑해줍니다.
전체 실행하는 방식
1. 테이블 혹은 데이터베이스에서 사용할 수 있는 데이터만 다시 모아서 새로운 공간에 저장합니다.
2. 모든 데이터를 조회해서 정리대상이 아닌 데이터만 새로 저장하는 방식으로 진행하기 때문에 처음에는 공간도 더 필요하며 객체에 배타적 락이 발생합니다.
3. 작업이 완료된 후 기존공간에 있던 데이터는 삭제하기 때문에 여유공간이 확보됩니다.
전체 Vacuum 을 실행하면 라인포인터의 공간과 데이터도 모두 삭제합니다.
이를 정리하면 다음과 같습니다.
표준 | 전체 | |
처리방식 | 다른 자료가 저장될 수 있게 빈 공간으로 표기 OS 입장에서는 여유 공간 미확보 됨 |
새 파일에 저장하는 방식 OS 입장에서 여유 공간 확보 됨 |
처리 속도 | 전체 Vacuum 보다 짧게 걸림 | 처리 속도가 느림 |
Lock 여부 | 여러 쿼리와 함께 사용 가능 | 배타적 잠금으로 다른 쿼리 사용 불가 |
VM 과 FSM
VM ( Visibility Map )
각각의 테이블은 VM 을 통해 어떤 페이지가 모두 활성화 된 상태의 튜플만 포함하는지를 추적합니다.
메인 릴레이션 파일노드 뒤에 _vm 이라는 접미사가 붙는 형태의 파일로 생성됩니다.
한 page 당 1 bit 씩 저장됩니다.
bit 는 Vacuum 작업에 의해 설정이 되며, 페이지 데이터 변경작업에 의해 초기화 됩니다.
FSM ( Free Space Map )
각각의 테이블과 인덱스는 fsm 을 통해 사용 가능한 공간을 추적합니다.
역시 메인 릴레이션 파일노드 뒤에 _fsm 이라는 접미사가 붙는 형태의 파일로 생성됩니다.
FSM 페이지는 이진 트리로 구성되어 있습니다.
각 리프노드는 Heap Page 를 나타내거나 하위 레벨의 FSM 페이지를 나타냅니다.
하위 레벨의 FSM 페이지에는 각 Heap 페이지에 사용 가능한 공간이 저장되어 있습니다.
만약 FSM 페이지가 초과된다면 페이지 하나를 더 생성합니다.
데이터베이스 ID 내의 파일을 조회하면 각 filenode 의 fsm 과 vm 이 있는 것을 확인할 수 있습니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
postgres@VirtualBox:~/10/main/base/13054$ ls -al | head -20
합계 7520
drwx------ 2 postgres postgres 4096 4월 5 00:44 .
drwx------ 7 postgres postgres 4096 4월 5 00:44 ..
-rw------- 1 postgres postgres 8192 4월 5 00:44 112
-rw------- 1 postgres postgres 8192 4월 5 00:44 113
-rw------- 1 postgres postgres 73728 4월 5 00:44 1247
-rw------- 1 postgres postgres 24576 4월 5 00:44 1247_fsm
-rw------- 1 postgres postgres 8192 4월 5 00:44 1247_vm
-rw------- 1 postgres postgres 393216 4월 5 00:44 1249
-rw------- 1 postgres postgres 24576 4월 5 00:44 1249_fsm
-rw------- 1 postgres postgres 8192 4월 5 00:44 1249_vm
-rw------- 1 postgres postgres 606208 4월 5 00:44 1255
-rw------- 1 postgres postgres 24576 4월 5 00:44 1255_fsm
-rw------- 1 postgres postgres 8192 4월 5 00:44 1255_vm
-rw------- 1 postgres postgres 90112 4월 5 00:44 1259
-rw------- 1 postgres postgres 24576 4월 5 00:44 1259_fsm
-rw------- 1 postgres postgres 8192 4월 5 00:44 1259_vm
-rw------- 1 postgres postgres 57344 4월 5 00:44 12890
-rw------- 1 postgres postgres 24576 4월 5 00:44 12890_fsm
-rw------- 1 postgres postgres 8192 4월 5 00:44 12890_vm
|
cs |
이 자료는 아래 경로에서 참고하였습니다.
'Database > PostgreSQL' 카테고리의 다른 글
[PostgreSQL] PostgreSQL 의 프로세스와 폴더 구조 (0) | 2021.04.14 |
---|---|
[PostgreSQL] PostgreSQL XID 설명 (0) | 2021.04.05 |
[PostgreSQL] PostgreSQL 아카이브 백업과 특정시점 복구방법 (0) | 2021.04.05 |
[PostgreSQL] PostgreSQL 파일 시스템 방식의 백업과 복원 (0) | 2021.04.02 |
[PostgreSQL] PostgreSQL 데이터베이스 데이터파일 경로 확인 방법 (0) | 2021.04.02 |