PostgreSQL 인덱스 무시 문제 해결 전략
카테고리
프로그래밍/소프트웨어 개발
서브카테고리
데이터 분석
대상자
PostgreSQL 성능 최적화를 위한 개발자, DBA.
- 난이도: 중간 (인덱스 활용 및 쿼리 계획자 이해 필요)*
핵심 요약
- GIN 인덱스 무시 시 CPU 과부하 발생
ILIKE '%...%'
패턴으로 인해 쿼리 계획자가 순차 스캔 선택char_length(name) >= 0
조건 추가로 효과적 해결- 로직 변경 없이 인덱스 사용 유도, 실행 시간 10배 감소
- 트랜잭션 사용 대신 무해한 조건 추가가 안전한 선택
- 확장성, 안정성, 의존성 감소
섹션별 세부 요약
- 문제 정의
company_entities
테이블의name
필드에서ILIKE
패턴 사용- GIN 인덱스 존재에도 순차 스캔 선택, CPU 사용량 13% 차지
- 17,000 행의 소규모 테이블에서 비효율적
- 초기 해결 시도
SET LOCAL enable_seqscan = off
트랜잭션 사용- 실행 시간 10배 감소 (46ms → 3.8ms)
- 단점: 트랜잭션 복잡성, 의도치 않은 행동 유발 가능성
- 무해한 조건 추가 전략
AND char_length(name) >= 0
조건 추가- 쿼리 결과 동일 (데이터 일치 검증)
- 인덱스 사용 유도 (Bitmap Index Scan 실행)
- 다른 접근 방식 실패
name IS NOT NULL
조건: 순차 스캔 유지pg_hint_plan
확장 사용: 의존성, 테스트 복잡성 증가
- 최종 결론
- 쿼리 재작성/확장 없이
char_length(name) >= 0
조건 추가 - 성능 향상, 안정성, 간결성 유지
결론
- *무해한 조건 추가(
char_length(name) >= 0
)를 통해 쿼리 계획자 유도** - 실행 시간 10배 감소, 트랜잭션/확장 없이 안전한 해결
- PostgreSQL의 인덱스 평가 논리 이해 필수 (소규모 테이블 +
%...%
패턴 시 주의)