Vacuum
Synopsis
VACUUM [ ( option [, …] ) ] [ table_and_columns [, …] ]
VACUUM [ FULL ] [ FREEZE ] [ VERBOSE ] [ ANALYZE ] [ table_and_columns [, …] ]where option can be one of:
FULL [ boolean ] FREEZE [ boolean ] VERBOSE [ boolean ] ANALYZE [ boolean ] DISABLE_PAGE_SKIPPING [ boolean ] SKIP_LOCKED [ boolean ] INDEX_CLEANUP { AUTO | ON | OFF } PROCESS_TOAST [ boolean ] TRUNCATE [ boolean ] PARALLEL integer
and table_and_columns is:
table_name [ ( column_name [, ...] ) ]
Description
vacuum 작업은 데드 튜플이 차지하는 스토리지를 회수합니다.
정상적인 PostgreSQL 운영 중 업데이트에 의해 삭제되거나 사용되지 않는 튜플은 해당 테이블에서 물리적으로 제거되지 않고 Vacuum 작업을 하기 전까지 존재하게 됩니다.
따라서 자주 업데이트되는 테이블은 주기적으로 Vacuum을 수행해야 합니다.
table_and_columns( 위 목차의 Synopsis 에서 ) 목록이 없으면 Vacuum 프로세스는 Vacuum 을 수행할 수 있는 권한을 가진 현재 유저의 현재 데이터베이스의 모든 테이블과 구체화 뷰를 처리합니다.
Vacuum Analyze 는 선택한 각 테이블에 대해 Vacuum 을 수행한 다음 Analyze 를 수행합니다.
일반 Vacuum 작업은 단순히 공간을 회수하여 재사용할 수 있도록 합니다.
해당 명령은 Exclusive Lock 을 얻지 못하므로 테이블의 일반적인 Read 및 Write 와 병렬로 동작할 수 있습니다.
그러나 대부분의 경우 테이블 내부 여분의 공간은 운영 체제에 반환되지 않고 동일한 테이블 내에서 재사용할 수 있도록 유지됩니다.
또한 Index 처리를 위해 여러 CPU를 활용할 수 있습니다.
이 기능을 Parallel Vacuum 이라고 합니다.
해당 기능을 비활성화하려면 Parallel 옵션을 사용하고 Parallel Workers 를 0 으로 지정합니다.
Vacuum Full 은 테이블의 전체 내용을 여분의 공간 없이 새 디스크 파일에 다시 작성하여 사용하지 않은 공간을 운영 체제로 반환할 수 있습니다.
해당 형식은 수행이 비교적 느리며 처리되는 동안 각 테이블에 대한 Access Exclusive Lock 이 필요합니다.
옵션 목록을 괄호로 묶으면 순서에 관계없이 작성할 수 있습니다.
괄호가 없으면 위에 표시된 순서대로 옵션을 지정해야 합니다.
Parameters
- FULL
- Vacuum Full 을 수행하게 되면 많은 공간을 회수할 수 있지만, 일반 Vacuum 에 비해 수행 시간이 더 오래 걸리고 테이블을 독점적으로 잠그는 Exclusive Lock 이 필요합니다.
- 해당 옵션은 테이블의 새로운 복사본을 작성하고 작업이 완료될 때까지 이전 복사본을 해제하지 않기 때문에 추가 디스크 공간도 필요합니다.
- 일반적으로 해당 옵션은 테이블 내에서 상당량의 공간을 회수해야 하는 경우에만 사용해야 합니다.
- FREEZE
- FREEZE 를 지정하는 것은 vacuum_freeze_min_age 및 vacuum_freeze_table_age 파라미터를 0 으로 설정하여 Vacuum 을 수행하는 것과 같습니다.
- 해당 옵션은 FULL 옵션이 지정된 경우 중복됩니다.
- VERBOSE
- 각 테이블에 대한 자세한 Vacuum 리포트를 출력합니다.
- 각 테이블에 대한 자세한 Vacuum 리포트를 출력합니다.
- ANALYZE
- 쿼리를 실행하는 가장 효율적인 방법을 결정하기 위해 Planner 가 사용하는 통계를 업데이트 합니다.
- 쿼리를 실행하는 가장 효율적인 방법을 결정하기 위해 Planner 가 사용하는 통계를 업데이트 합니다.
- DISABLE_PAGE_SKIPPING
- 일반적으로 VACUUM 수행은 Visibility Map 을 기반으로 페이지를 건너뜁니다. 모든 튜플이 고정된 것으로 알려진 페이지는 항상 건너뛸 수 있으며 모든 튜플이 모든 트랜잭션에 표시되는 것으로 알려진 페이지는 Aggressive Vacuum 을 수행할 때를 제외하고 건너뛸 수 있습니다. 또한 Aggressive Vacuum 을 수행하는 경우를 제외하고는 다른 세션에서 페이지 사용이 완료될 때까지 기다리지 않기 위해 일부 페이지를 건너뛸 수 있습니다. 이 옵션은 모든 페이지 건너뛰기 동작을 비활성화하며, Visibility Map 의 내용이 의심스러운 경우에만 사용하도록 되어 있으며, 이는 데이터베이스 손상을 유발하는 하드웨어 또는 소프트웨어 문제가 있는 경우에만 수행해야 합니다.
- 일반적으로 VACUUM 수행은 Visibility Map 을 기반으로 페이지를 건너뜁니다. 모든 튜플이 고정된 것으로 알려진 페이지는 항상 건너뛸 수 있으며 모든 튜플이 모든 트랜잭션에 표시되는 것으로 알려진 페이지는 Aggressive Vacuum 을 수행할 때를 제외하고 건너뛸 수 있습니다. 또한 Aggressive Vacuum 을 수행하는 경우를 제외하고는 다른 세션에서 페이지 사용이 완료될 때까지 기다리지 않기 위해 일부 페이지를 건너뛸 수 있습니다. 이 옵션은 모든 페이지 건너뛰기 동작을 비활성화하며, Visibility Map 의 내용이 의심스러운 경우에만 사용하도록 되어 있으며, 이는 데이터베이스 손상을 유발하는 하드웨어 또는 소프트웨어 문제가 있는 경우에만 수행해야 합니다.
- SKIP_LOCKED
- Vacuum 작업을 시작할 때 Lock 을 즉시 할 수 없다면 기다리지 않도록 지정합니다. 이 옵션을 사용하더라도 Index 를 열 때 VACUUM 작업이 차단될 수 있습니다. 또한 VACUUM ANALYZE 는 파티션 및 일부 유형의 외부 테이블에서 샘플 행을 획득할 때 차단될 수 있습니다. 또한 VACUUM 작업은 일반적으로 지정된 파티션 테이블의 모든 파티션을 처리하지만 이 옵션을 사용하면 파티션 테이블에 충돌하는 잠금이 있는 경우 모든 파티션을 건너뜁니다.
- Vacuum 작업을 시작할 때 Lock 을 즉시 할 수 없다면 기다리지 않도록 지정합니다. 이 옵션을 사용하더라도 Index 를 열 때 VACUUM 작업이 차단될 수 있습니다. 또한 VACUUM ANALYZE 는 파티션 및 일부 유형의 외부 테이블에서 샘플 행을 획득할 때 차단될 수 있습니다. 또한 VACUUM 작업은 일반적으로 지정된 파티션 테이블의 모든 파티션을 처리하지만 이 옵션을 사용하면 파티션 테이블에 충돌하는 잠금이 있는 경우 모든 파티션을 건너뜁니다.
- INDEX_CLEANUP
- 일반적으로 Vacuum 작업은 테이블에 데드 튜플이 거의 없을 때 Index Vacuum 을 건너뜁니다. 테이블의 모든 Index 를 처리하는 비용은 이러한 일이 발생할 때 데드 Index 튜플을 제거하는 이점을 크게 초과할 것으로 예상됩니다. 해당 옵션은 데드 튜플이 0 개보다 많은 경우 Vacuum 작업이 Index 를 처리하도록 강제하는데 사용할 수 있습니다. 기본 값은 AUTO 입니다. INDEX_CLEANUP 이 ON 으로 설정된 경우 Vacuum 작업은 Index 에 모든 데드 튜플을 보수적으로 제거합니다. INDEX_CLEANUP 을 OFF 로 설정하면 테이블에 데드 튜플이 많은 경우에도 Vacuum 작업이 항상 Index Vacuum 을 건너뛰도록할 수 있습니다. 해당 옵션은 Index 가 없는 테이블에는 적용되지 않으며 FULL 옵션이 사용된 경우엔 무시됩니다.
- 일반적으로 Vacuum 작업은 테이블에 데드 튜플이 거의 없을 때 Index Vacuum 을 건너뜁니다. 테이블의 모든 Index 를 처리하는 비용은 이러한 일이 발생할 때 데드 Index 튜플을 제거하는 이점을 크게 초과할 것으로 예상됩니다. 해당 옵션은 데드 튜플이 0 개보다 많은 경우 Vacuum 작업이 Index 를 처리하도록 강제하는데 사용할 수 있습니다. 기본 값은 AUTO 입니다. INDEX_CLEANUP 이 ON 으로 설정된 경우 Vacuum 작업은 Index 에 모든 데드 튜플을 보수적으로 제거합니다. INDEX_CLEANUP 을 OFF 로 설정하면 테이블에 데드 튜플이 많은 경우에도 Vacuum 작업이 항상 Index Vacuum 을 건너뛰도록할 수 있습니다. 해당 옵션은 Index 가 없는 테이블에는 적용되지 않으며 FULL 옵션이 사용된 경우엔 무시됩니다.
- PROCESS_TOAST
- Vacuum 작업이 각 관계에 해당하는 TOAST 테이블이 있는 경우 처리를 시도하도록 지정합니다. 이는 일반적으로 기본 동작입니다. 해당 옵션을 FALSE 로 설정하면 기본 관계만 Vacuum 하여 유용할 수 있습니다.
- Vacuum 작업이 각 관계에 해당하는 TOAST 테이블이 있는 경우 처리를 시도하도록 지정합니다. 이는 일반적으로 기본 동작입니다. 해당 옵션을 FALSE 로 설정하면 기본 관계만 Vacuum 하여 유용할 수 있습니다.
- TRUNCATE
- Vacuum 작업이 테이블 끝에 있는 빈 페이지를 잘라내고 잘린 페이지의 디스크 공간을 운영체제로 반환하도록 지정합니다. vacuum_truncate 옵션이 Vacuum 수행할 테이블에 대해 FALSE 로 설정되지 않은 경우 기본값입니다. 해당 옵션을 FALSE 로 설정하면 자르기에 필요한 테이블에 대한 ACCESS EXCLUSIVE LOCK 을 방지하는 데 유용할 수 있습니다. 해당 옵션은 FULL 옵션이 사용되면 무시됩니다.
- Vacuum 작업이 테이블 끝에 있는 빈 페이지를 잘라내고 잘린 페이지의 디스크 공간을 운영체제로 반환하도록 지정합니다. vacuum_truncate 옵션이 Vacuum 수행할 테이블에 대해 FALSE 로 설정되지 않은 경우 기본값입니다. 해당 옵션을 FALSE 로 설정하면 자르기에 필요한 테이블에 대한 ACCESS EXCLUSIVE LOCK 을 방지하는 데 유용할 수 있습니다. 해당 옵션은 FULL 옵션이 사용되면 무시됩니다.
- PARALLEL
- 백그라운드 프로세스를 사용하여 Index Vacuum 및 Index Cleanup 단계를 병렬로 수행합니다. 작업을 수행하는 데 사용되는 프로세스 수는 max_parallel_maintenance_workers 에 의해 제한된 경우 Parallel Vacuum 을 지원하는 Index 수와 같습니다. Index 크기가 min_parallel_index_scan_size 보다 큰 경우에만 Index Parallel Vacuum 이 수행될 수 있습니다. 지정된 것보다 적은 수의 프로세스 또는 프로세스가 전혀 없는 경우에도 Vacuum 이 수행될 수 있습니다. Index 당 하나의 프로세스만 사용할 수 있습니다. 따라서 테이블에 최소 2개의 Index 가 있는 경우에만 Parallel Vacuum 이 시작됩니다. 해당 옵션은 FULL 옵션과 함께 사용할 수 없습니다.
Parameters Values
- boolean
- 선택한 옵션을 적용하거나 적용하지 않을지 지정합니다.
- 옵션을 활성화하려면 TRUE, ON 또는 1 을 사용합니다.
- 옵션을 비활성화하려면 FALSE, OFF 또는 0 을 사용합니다.
- 생략된 경우 TRUE 로 간주됩니다.
- integer
- 선택한 옵션에 정수 값을 지정합니다.
- table_name
- Vacuum 을 수행할 특정 테이블 또는 구체화 뷰의 이름을 지정합니다.
- 지정된 테이블이 파티션 테이블인 경우 모든 하위 파티션들에 Vacuum 수행합니다.
- column_name
- Analyze 수행할 특정 컬럼의 이름을 지정합니다.
- 모든 컬럼에 대한 기본값입니다.
- 컬럼이 지정되면 ANALYZE 옵션도 지정해야 합니다.
Note
- 테이블에 Vacuum 수행하려면 일반적으로 테이블의 소유자 또는 슈퍼유저여야 합니다. 그러나 데이터베이스 소유자는 공유 카탈로그를 제외한 데이터베이스의 모든 테이블을 Vacuum 할 수 있습니다. Vacuum 수행은 호출 사용자가 Vacuum 에 대한 권한이 없는 모든 테이블을 건너뜁니다. Vacuum 은 트랜잭션 블록 내에서 실행할 수 없습니다.
- GIN 인덱스가 있는 테이블의 경우 VACUUM 은 보류 중인 인덱스 항목을 기본 GIN 인덱스 구조의 적절한 위치로 이동하여 보류 중인 인덱스 삽입을 완료합니다.
- 데드 튜플을 제거하기 위해 모든 데이터베이스를 정기적으로 Vacuum 을 수행하는 것이 좋습니다. PostgreSQL에는 Vacuum 유지 관리를 자동화할 수 있는 “autovacuum” 기능이 포함되어 있습니다.
- FULL 옵션은 일상적인 사용에는 권장되지 않지만 특별한 경우에 유용할 수 있습니다. 예를 들어 테이블에서 대부분의 행을 삭제하거나 업데이트한 경우 테이블을 물리적으로 축소하여 디스크 공간을 덜 차지하고 더 빠른 테이블 스캔을 허용하려는 경우를 들 수 있습니다. VACUUM FULL 은 일반적으로 일반 VACUUM 수행보다 더 테이블을 축소합니다.
- PARALLEL 옵션은 오직 Vacuum 목적으로만 사용됩니다. ANALYZE 옵션과 함께 이 옵션을 지정하면 ANALYZE에 영향을 주지 않습니다.
- VACUUM 작업은 I/O 트래픽을 크게 증가시켜 다른 활성 세션의 성능을 저하시킬 수 있습니다. 그러므로 Cost-base Vacuum Delay 기능을 사용하는 것이 좋습니다. Prallel Vacuum 의 경우 각 프로세스는 해당 프로세스가 수행한 작업에 비례하여 쉬게 됩니다.
- FULL 옵션 없이 VACUUM을 실행하는 각 백엔드는 pg_stat_progress_vacuum 뷰에서 진행 상황을 리포트합니다. VACUUM FULL을 실행하는 백엔드는 pg_stat_progress_cluster 뷰에서 진행 상황을 리포트합니다.
지금까지 ‘PostgreSQL Vacuum (SQL)’에 관해 알아보았습니다
‘PostgreSQL의 Replication’을 바로 이어서 확인해보세요!