Vacuum 이후에 일시적으로 입력들이 지연이 있다가 점차 지연 속도가 낮아지면서 해소가 되는 현상을 여러번 확인하였습니다.
원인을 파악하고자 하였고 어떤 방법으로 개선할 수 있을지 확인해보았습니다.
해당 테이블은 약 160GB로 UPDATE와 INSERT가 1:1 비율 수준으로 발생하고 있었습니다.
Aurora 였기 때문에 Vacuum으로 인한 Disk 처리량이 부족하다고는 고려하지 않았고
Vacuum 이후 Dead Tuple 정리와 Free SpaceMap 정보가 업데이트 된 이후 INSERT가 여러 비어져 있는 공간에 입력되기 위해 처리 속도가 지연되는건 아닐까라는 가정을 세웠습니다.
만약 가정이 맞다면 Vacuum을 좀 더 빈번하게 동작하게하여서 입력의 성능 저하를 낮출 수 있지 않을까라고 생각하였습니다.
Vaccum 로그
| 시간 | 전체 Page | 조회 Page | 삭제 TUPLE | 처리X TUPLE | 소요 시간(초) | 특이 사항 |
| TableA | ||||||
| 10/10 11:09 (auto vacuum) |
19,127,681 | 4,123,045 | 8,171,897 | 79,528,797 | 767 | 입력 쿼리 지연 시간 증가 1.26ms (약 6배) |
| 10/27 06:00 (vacuum) |
20,337,146 | 834,422 | 583,577 | 3,342,709 | 384 | 1.77ms |
| 10/27 18:00 (vacuum 추가) |
20,337,146 | 419,118 | 257,572 | 1,734,047 | 36 | 입력 쿼리 지연 시간 미 증가 index scan bypassed |
| 10/28 06:00 (vacuum) |
20,337,146 | 575,745 | 273,940 | 2,153,684 | 345 | 1.75ms |
| 10/29 18:00 index_cleanup on |
20,337,146 | 404,214 | 249,099 | 1,654,231 | 302 | 0.67ms |
| 10/30 06:00 index_cleanup on |
20,337,146 | 373,517 | 272,550 | 1,463,544 | 298 | 1.09ms |
| TableB | ||||||
| 10/28 06:00 (vacuum) |
20,737,855 | 828,169 | 34,663 | 3,293,534 | 142 | 특이사항 없음 |
처음 수동 Vacuum 구문을 추가하였을 때 생각보다 Vacuum 처리 시간이 고르게 분포되지 않고 입력 지연 또한 유지되는걸 확인하였습니다. Vacuum 로그 중 index scan bypassed라는 구문을 확인하였고 해당 내용을 좀 더 확인하였습니다.
index scan bypassed??
베큠 프로세서가 인덱스 조회가 불필요하다고 판단되면 해당 단계를 스킵하는 방식.
아래 트리거에 의하여 실행됨
/*
* Threshold that controls whether we bypass index vacuuming and heap
* vacuuming as an optimization
*/
#define BYPASS_THRESHOLD_PAGES 0.02 /* i.e. 2% of rel_pages */
[...]
threshold = (double) vacrel->rel_pages * BYPASS_THRESHOLD_PAGES;
bypass = (vacrel->lpdead_item_pages dead_items) < (32L * 1024L * 1024L)));
(테이블에 LP_DEAD (제거된 행 버전을 가리키는 행 포인터 튜플이 페이지에서 제거되었지만 라인 포인터 슬롯을 아직 재사용할 수 없음을 의미) 2%를 넘지 않고 TID 저장소가 아직 32MB를 초과하지 않으면 (자동)VACUUM은 인덱스 진공 작업을 건너뜁니다.)
INDEX_CLEANUP 옵션을 통하여 스킵하지 않도록 설정 가능
해당 사항으로 인하여 Vacuum 작업이 고르게 분포되지 않았다고 생각하였으며 옵션을 추가한 이후로 입력 쿼리의 평균 처리 시간이 급격히 증가하는 현상은 해소되었습니다.

'공부 > DATABASE' 카테고리의 다른 글
| [AWS] Database SavingPlan (0) | 2026.01.24 |
|---|---|
| [Aurora, Aws DocumentDB] I/O Optimized (0) | 2026.01.24 |
| [Aurora MySQL] 파티션 테이블 DDL (0) | 2026.01.18 |
| [ElastiCache] Redis CrossSlot 에러 (0) | 2026.01.18 |
| [PostgreSQL] GIN 인덱스 특징 (0) | 2026.01.18 |