데이터 블로그

AMAZON REDSHIFT. VACUUM 명령

AWS

VACUUM 명령은 다음의 기능을 수행한다.


기능

  1. 정렬되지 않은 리전의 데이터 테이블 정렬

  2. 삭제된 공간 회수

  3. 인터리브 테이블 인덱스 재지정


세 가지 기능 모두다 성능과 많은 밀접한 관계가 있다. 정렬되지 않은 리전의 데이터 테이블 정렬은 SORT KEY를 통한 데이터 조회 최적화가 이루어 진다. Amazon Redshift는 삭제(갱신)된 데이터를 바로 지우지 않고 삭제된 행으로만 표시하고 그대로 두기 때문에 데이터를 실제로 지우고 줄어든 공간을 회수하는 작업도 VACUUM 명령을 통해 이루어진다.


구문

VACUUM [ FULL | SORT ONLY | DELETE ONLY | REINDEX ]

[ [ table_name ] [ TO threshold PERCENT ] ]


파라미터

  • FULL, SORT ONLY, DELETE ONLY, REINDEX

VACUUM 명령이 수행하는 세 가지 기능을 선택적으로 수행할 수 있도록 파라미터가 제공된다. 파라미터마다 수행되는 기능을 정리하면 아래 표와같다.



작업

옵션

FULL

SORT ONLY

DELETE ONLY

REINDEX

테이블 정렬

O

O

X

O

삭제된 공간 회수

O

X

O

O

인터리브 테이블 인덱스 재지정

X

X

X

O



  • table_name: VACUUM 명령을 수행할 테이블 이름이다. 지정하지 않으면 데이터베이스의 모든 테이블에 대해 수행된다. 다만, REINDEX 파라미터를 사용할 때는 반드시 테이블 이름을 지정해야 한다.


  • TO threshold PERCENT: 지정한 임계값 이상으로 테이블이 정렬되어 있다면 정렬 단계를 생략한다. 지정한 임계값 이상을 목표로 삭제된 공간을 회수한다. 기본값은 95



내 생각

  1. 보통은 FULL로 돌려라. 시간이 너무 오래 걸리면, SORT ONLY, DELETE ONLY로 나눠 실행하면 좋을 듯

  2. 인터리브 테이블의 경우, VACUUM REINDEX를 실행해야 한다. 다만, 엄청난 시간이 걸릴 수 있으므로 시간 제약을 고려해야 한다.

  3. 테이블에 정렬되지 않은 큰 리전이 있는 경우, 전체 복사가 vacuum보다 훨씬 빠르다.


제약/주의사항

  1. 클러스터당 한 번에 하나의 VACUUM 명령만 실행할 수 있다.

  2. 실행중에 디스크 사용량이 (많이) 늘어날 수 있다.

  3. 실행중에 쿼리 성능이 느려질 수 있다. 특히 COPY 같은 쓰기 작업은 피하자. 그리고 짧은 시간이지만 테이블이 단독 잠금에 걸릴 수 있다.

  4. 뭔가 이상하다 싶으면 중단하자.



시스템 테이블


-- 정렬되지 않은 행 수 확인
select "table"
	, size
	, unsorted as unsorted_row_ratio
	, tbl_rows as total_rows
	, tbl_rows * unsorted * 0.01 as unsorted_rows
from svv_table_info

-- 삭제된 행 수 확인
select visible_rows, total_rows - visible_rows as deleted_rows
from
(
	select 
		(select sum(rows) from stv_tbl_perm where name = 'table_name') as total_rows
		, (select count(*) from table_name) as visible_rows 
) as rst

-- VACUUM 진행상황 확인
select * from svv_vacuum_progress

-- VACUUM 실행 이력
select * from svv_vacuum_summary


merge_increments bigint vacuum 작업의 병합 단계를 완료하는 데 필요한 병합 증분의 수.

>> merge_increments 열은 각각의 vacuum 작업을 위해 병합된 데이터 양을 표시

>> 연속적 vacuum 동안 병합 증분의 수가 테이블 크기 증가에 비례하여 증가하는 경우,

>> 기존의 정렬된 리전과 새로 정렬된 리전이 중첩되기 때문에 각각의 vacuum 작업이 다시 병합하는 이 테이블의 행이 증가하고 있음을 나타냄.


elapsed_time bigint Elapsed run time of the vacuum operation (in microseconds).

>> 실행 시간(마이크로 초)


row_delta bigint vacuum 전과 후의 테이블의 총 행 수의 차이.

>> 삭제된 행의 영향


sortedrow_delta bigint vacuum 전과 후의 정렬된 테이블 행 수의 차이.

>> 정렬되지 않은 리전의 행 + 삭제된 행


block_delta integer vacuum 전과 후의 테이블 블록 수의 차이.