[DB] Vacuum과 Autovacuum이란?

Image: anyrecover.com

Vacuum이란?

Vacuum은 한마디로 휴지통 비우기와 같습니다.

운영체제에서 파일을 삭제하면 지워지지만 휴지통으로 옮겨집니다. 휴지통으로 옮겨진 파일은 보이진 않지만 디스크 용량을 차지하고 있습니다. Postgres도 이와 같습니다. delete 된 데이터는 삭제되었어도 실제로 차지하는 공간은 그대로 남아있습니다. 이 공간을 Bloat라고 부르고 이런 공간을 차지하는 데이터를 dead tuple 이라고 부릅니다. 참고로 Postgres에서 update는 insert와 delete를 수행하기 때문에 update나 delete된 데이터는 dead tuple이 됩니다.

Vacuum은 Non-blocking작업입니다.

데이터를 읽고 쓰는데 영향을 주는 Lock을 Exclusive락이라고 합니다. Vacuum은 데이터에 Exclusive락을 잡지 않아서 트렌젝션에서 데이터를 읽고 쓰는데 영향을 주지 않습니다. 이를 Non-blocking이라고 부릅니다. 따라서 여러 트렌젝션에서 쓰기작업을 수행하는 테이블에도 vacuum을 병렬로 수행할 수 있습니다. 하지만 vacuum이 실행되면 많은 I/O 트래픽을 유발하기 때문에 다른 트랜젝션에 성능을 나쁘게 만듭니다.

Dead tuple → Free space

참조되지 않는 Dead tuple은 vacuum을 통해 삭제되고 비워진 공간은 예비공간으로 남게됩니다. Database마다 정해진 격리수준이 있고, 격리수준에 따라 지워진 데이터더라도 아직 트랜젝션에서 참조가 될 수 있습니다. 하지만 참조가 없는 데이터는 Vacuum의 대상이 됩니다. Vacuum으로 깨끗해진 데이터 공간은 disk로 즉시 반환되지 않고 신규데이터를 위한 예비공간으로 남아있게 됩니다.

Autovacuum이란?

Autovacuum = Vacuum + Analyze

Autovacuumdead tuple이 차지하던 공간을 사용가능한 공간으로 변경해주는 vacuum작업과 테이블의 통계정보를 갱신하는 analyze 작업을 동시에 수행합니다. auto- 이름에서 알 수 있듯 자동으로 실행되며 실행되는 기준을 가지고 있습니다. 이 기준을 threshold (문턱값) 이라고 부릅니다. 그리고 두 가지 작업을 동시에 수행하기 때문에 실행기준 또한 vacuum과 analyze 별도로 지정해 줄 수 있습니다.

Threshold = 전체 데이터 수 * 비율 + 최소문턱값

threshold를 계산하는 식은 전체 데이터 수 * 비율 + 최소문턱값 으로 구할 수 있습니다. 식 앞부분인 전체 데이터 수 * 비율 은 dead tuple이 전체 데이터에서 몇 퍼센트가 될 때 vacuum이 실행될 것인지 의미합니다. 식 뒷부분인 최소문턱값dead tuple이 최소한 몇개 이상될 때 실행될 것인지 고정값을 의미합니다.

-- vacuum threshold  
autovacuum_vacuum_scale_factor * number of tuples + autovacuum_vacuum_threadhold
-- analyze threshold
autovacuum_analyze_scale_factor * number of tuples + autovacuum_analyze_threshold
-- 전역 설정
alter system set autovacuum_vacuum_scale_factor = 0.1;
-- 확인 쿼리
select * from pg_settings where where name = 'autovacuum_vacuum_scale_factor';
-- 개별설정
alter table {{schema.table_name}} set (autovacuum_vacuum_scale_factor=0.1);
-- 확인쿼리
select relname, reloptions from pg_class where relname={{table_name}};
-- 설정 초기화
alter table {{schema.table_name}} reset (autovacuum_vacuum_scale_factor);

참고문서

--

--

Blog https://chrisjune.dev Work for www.29cm.co.kr

Love podcasts or audiobooks? Learn on the go with our new app.

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store