명령어/DB

[PostgreSQL] vacuumdb 청소·통계 갱신

jykim23 2026. 7. 30. 22:16
반응형

설치·접속: PostgreSQL 설치와 접속

부제: 죽은 튜플을 회수하고 플래너 통계를 셸에서 갱신한다

vacuumdb -d shop --analyze            # shop 청소 + 통계 갱신
vacuumdb -d shop -t orders --analyze  # orders 테이블만
vacuumdb -d shop --analyze --verbose  # 진행 내역 자세히
vacuumdb: vacuuming database "shop"
INFO:  vacuuming "shop.pg_catalog.pg_proc"
INFO:  finished vacuuming "shop.pg_catalog.pg_proc": index scans: 0
pages: 0 removed, 98 remain, 1 scanned (1.02% of total)
tuples: 0 removed, 3297 remain, 0 are dead but not yet removable
new relfrozenxid: 794, which is 72 XIDs ahead of previous value
avg read rate: 0.000 MB/s, avg write rate: 62.500 MB/s
buffer usage: 20 hits, 0 misses, 1 dirtied

vacuumdbVACUUM/ANALYZE SQL을 셸에서 실행하는 래퍼다. PostgreSQL은 UPDATE·DELETE를 해도 옛 행(죽은 튜플)을 바로 지우지 않고 남겨 두는데, VACUUM이 이 공간을 회수해 테이블 비대화(bloat)를 막는다. --analyze를 함께 주면 쿼리 플래너가 참고하는 통계까지 갱신해 실행 계획이 좋아진다. 평소에는 autovacuum이 알아서 돌지만, 대량 적재·삭제 직후나 배치 작업 뒤에는 수동으로 한 번 돌려 주는 게 안전하다. --verbose를 붙이면 위처럼 테이블별 회수·통계 내역이 그대로 찍힌다.

이렇게도 쓴다

특정 테이블만 콕 집어 청소·통계 갱신한다.

vacuumdb -d shop -t orders --analyze

 

통계만 빠르게 갱신한다. (대량 INSERT 직후 플랜 개선)

vacuumdb -d shop --analyze-only

 

여러 테이블을 병렬로 처리해 시간을 줄인다. (-j)

vacuumdb -d shop -j 4 --analyze

 

모든 DB를 한 번에 청소한다. (--all)

vacuumdb --all --analyze

 

트랜잭션 ID 소진이 걱정될 때 freeze까지 수행한다.

vacuumdb -d shop --freeze --analyze

 

공간을 물리적으로 되돌려주는 FULL 청소를 야간에 돌린다. (락 주의)

vacuumdb -d shop --full -t orders

 

매일 새벽 통계 갱신을 cron에 얹는다.

30 2 * * * vacuumdb -d shop --analyze-only -q
반응형