PostgreSQL 인덱스 스캔 유형: 인덱스-온리와 비트맵
인덱스-온리 스캔과 비트맵 스캔의 개념, 동작 비교, 비용 특성 및 EXPLAIN 예제를 통한 이해 중심의 설명
목차
개요
PostgreSQL에서 쿼리 성능을 좌우하는 핵심 요소 중 하나는 인덱스 스캔 방식이다. 흔히 접하는 인덱스-온리와 비트맵 스캔은 처리 방식과 비용 모델이 다르다. 이 글에서는 인덱스-온리 스캔과 비트맵 스캔의 동작 원리, 장단점, 사용 조건을 초보자도 이해할 수 있도록 정리한다. 또한 실제 EXPLAIN 예제와 함께 index-only scan postgres 및 bitmap scan postgres 설명을 자연스럽게 연결한다.
인덱스 스캔의 기본 개념
인덱스 스캔 종류 개요
PostgreSQL의 인덱스 스캔은 주로 세 가지로 나뉜다.
- 순차적 인덱스 스캔 (Index Scan)
- 인덱스-온리 스캔 (Index-Only Scan)
- 비트맵 스캔 (Bitmap Scan)
각 방식은 테이블 크기, 인덱스 커버리지, 결과 행수에 따라 적절성이 달라진다. 특히 인덱스-온리 스캔은 인덱스만으로 결과를 반환할 수 있을 때 최적 성능을 발휘한다.
인덱스-온리 스캔 (Index-Only Scan)
동작 원리
인덱스-온리 스캔은 쿼리에 필요한 모든 컬럼이 인덱스에 포함되어 있고, 인덱스의 MVCC(visibility) 정보가 최신이면 테이블 본문 접근 없이 인덱스만으로 결과를 반환한다. 이 방식은 디스크 I/O를 크게 줄여 빠른 응답을 제공한다.
장단점
- 장점: 테이블 접근 비용 없음, 빠른 읽기 성능
- 단점: 인덱스가 더 커질 수 있음, VACUUM이 제대로 되지 않으면 visibility 문제로 인해 실패
실제 예제
간단한 테이블과 인덱스를 만들고 index-only scan postgres가 선택되는 예제이다.
CREATE TABLE users (id serial PRIMARY KEY, email text, created_at timestamp);
CREATE INDEX idx_users_email_created ON users (email, created_at);
EXPLAIN ANALYZE
SELECT email, created_at FROM users WHERE email = 'alice@example.com';
위와 같이 질의가 인덱스에 포함된 컬럼만 조회하면 PostgreSQL은 인덱스-온리 스캔을 고려한다. EXPLAIN 결과에서 "Index Only Scan"이 보이면 성공적으로 인덱스만으로 처리된 것이다.
비트맵 스캔 (Bitmap Scan)
동작 원리
비트맵 스캔은 여러 인덱스를 조합하거나 대량의 결과를 효율적으로 처리할 때 사용된다. 우선 각 인덱스에서 일치하는 레코드의 위치를 비트맵으로 표시한 뒤, 이 비트맵을 합치거나 정리하여 실제 테이블을 순차 접근한다. 이 과정은 랜덤 I/O를 순차 I/O로 변환해 비용을 줄이는 효과가 있다.
장단점
- 장점: 여러 인덱스를 조합 가능, 많은 행을 반환할 때 효율적
- 단점: 중간 비트맵을 메모리에 유지해야 하므로 메모리 사용량이 증가할 수 있음
실습 예제
두 인덱스를 조합해 bitmap scan postgres 설명을 보여주는 예제이다.
CREATE INDEX idx_users_email ON users (email);
CREATE INDEX idx_users_created ON users (created_at);
EXPLAIN ANALYZE
SELECT * FROM users WHERE email = 'alice@example.com' AND created_at > '2024-01-01';
이 경우 PostgreSQL은 두 인덱스에서 매칭되는 위치를 비트맵으로 만든 뒤 테이블을 순차 스캔하는 형태를 택할 수 있다. EXPLAIN 결과에 "Bitmap Index Scan" 또는 "Bitmap Heap Scan"이 나타난다.
언제 어떤 스캔을 선택할까
선택 기준은 다음과 같다.
- 조회 컬럼이 인덱스에 모두 포함되면 인덱스-온리 스캔 우선 고려
- 조건이 복수 인덱스를 필요로 하거나 반환 행이 많으면 비트맵 스캔이 유리
- 테이블이 자주 업데이트되는 경우 인덱스-온리 스캔은 VACUUM 상태에 민감
실무 팁과 점검 항목
운영 환경에서 성능을 최적화할 때 확인할 항목이다.
- EXPLAIN (ANALYZE, BUFFERS)로 실제 I/O 패턴 확인
- 인덱스가 쿼리를 완전히 커버하는지 검토
- VACUUM 및 autovacuum 설정으로 visibility 정보 유지
- 통계(ANALYZE) 주기적 갱신으로 최적의 플랜 유도
요약
인덱스-온리 스캔과 비트맵 스캔은 각각의 강점이 있다. index-only scan postgres는 인덱스만으로 결과를 제공할 때 최고의 선택이고, bitmap scan postgres 설명은 여러 인덱스 조합이나 대량 결과 처리에 적합함을 강조한다. 인덱스 설계와 유지 관리, EXPLAIN 분석을 함께 고려하면 인덱스 스캔 종류 postgres에 맞는 최적의 전략을 세울 수 있다.