명령어/DB

[PostgreSQL] reindexdb 인덱스 재구성

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

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

부제: 비대해지거나 손상된 인덱스를 셸에서 다시 만든다

reindexdb -d shop                 # shop의 모든 인덱스 재구성
reindexdb -d shop -t orders       # orders 테이블 인덱스만
reindexdb -d shop --echo          # 실행되는 SQL도 출력
SELECT pg_catalog.set_config('search_path', '', false);
REINDEX DATABASE shop;

reindexdbREINDEX SQL을 감싼 래퍼로, 인덱스를 처음부터 다시 만든다. 인덱스도 오래 쓰면 잦은 갱신으로 비대해지거나(bloat) 드물게 손상돼 검색 성능이 떨어지는데, 재구성으로 조밀하고 깨끗한 상태로 되돌린다. 주의할 점은 기본 REINDEX가 대상 테이블에 쓰기 락을 건다는 것이다. 운영 중 서비스라면 락 없이 재구성하는 --concurrently(PostgreSQL 12+)를 쓰거나 트래픽이 적은 시간대에 돌린다. 성공하면 별다른 출력 없이 조용히 끝나고, --echo로 내부 SQL을 확인할 수 있다.

이렇게도 쓴다

서비스 중단 없이 락을 최소화해 재구성한다. (PostgreSQL 12+)

reindexdb -d shop --concurrently

 

특정 테이블의 인덱스만 재구성한다.

reindexdb -d shop -t orders

 

인덱스 하나만 지정해 다시 만든다. (--index)

reindexdb -d shop --index idx_orders_user

 

시스템 카탈로그 인덱스까지 재구성한다. (--system)

reindexdb -d shop --system

 

모든 DB의 인덱스를 병렬로 재구성한다. (--all, -j)

reindexdb --all -j 4 --concurrently

 

인덱스 비대화를 확인한 뒤 재구성한다. (psql 조합)

psql -d shop -c "SELECT indexrelname, pg_size_pretty(pg_relation_size(indexrelid)) FROM pg_stat_user_indexes ORDER BY 2 DESC;" && reindexdb -d shop --concurrently

 

매주 일요일 새벽 재구성을 cron에 건다.

0 5 * * 0 reindexdb -d shop --concurrently -q
반응형