순차 스캔과 인덱스 스캔
순차 스캔이 적절한 경우와 인덱스 스캔이 필요한 경우를 알고, 플래너가 이를 어떻게 결정하는지 배워보세요.
순차 스캔과 인덱스 스캔은(는) CoddyKit의 무료 SQL Academy 강의입니다. 이것은 4개 중 2번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 SQL Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. SQL Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
행을 찾는 두 가지 방법
데이터베이스에는 행을 읽는 두 가지 기본 전략이 있습니다:
- 순차 스캔 — 테이블의 모든 페이지를 읽습니다
- 인덱스 스캔 — 인덱스를 따라가며 일치하는 행을 가져옵니다
순차 스캔이 적합한 경우
어차피 테이블 대부분이 필요하다면 인덱스를 읽고 일치하는 각 행을 가져오는 것보다 테이블을 스캔하는 편이 저렴합니다. 대략 행의 10~20%를 초과하면 → 순차 스캔이 유리합니다.
인덱스 스캔이 유리한 경우
선택적인 쿼리, 즉 행의 작은 일부만 필요한 쿼리에서는 인덱스가 효과적입니다:
EXPLAIN SELECT * FROM users WHERE id = 42;
-- Index Scan using users_pkey (cost=0.43..8.45 rows=1)
EXPLAIN SELECT * FROM users WHERE active;
-- Seq Scan on users (cost=0.00..15000.00 rows=950000)
-- (because most users are active)인덱스 스캔과 인덱스 전용 스캔
경우에 따라 필요한 열이 인덱스에 모두 들어 있어 테이블에서 가져올 필요가 없습니다. 이를 인덱스 전용 스캔이라고 합니다:
CREATE INDEX users_email_id_idx ON users(id) INCLUDE (email);
EXPLAIN SELECT email FROM users WHERE id = 42;
-- Index Only Scan using users_email_id_idx비트맵 인덱스 스캔
선택도가 중간 정도이면 PostgreSQL은 일치하는 행의 비트맵을 만든 다음 물리적 순서대로 가져올 수 있습니다. 이렇게 하면 무작위 입출력보다 빠릅니다:
EXPLAIN SELECT * FROM orders WHERE status = 'pending';
-- Bitmap Heap Scan on orders
-- Recheck Cond: (status = 'pending')
-- -> Bitmap Index Scan on orders_status_idx플래너가 순차 스캔을 선택하는 이유
일반적인 이유는 다음과 같습니다:
- 필터링하는 열에 인덱스가 없습니다
- 인덱스를 사용할 수 없습니다(열에 함수를 적용하거나, OR 절을 사용하거나, 형식이 일치하지 않는 경우)
- 예상 행 수가 너무 많아 인덱스를 사용할 가치가 없습니다
- 통계가 오래되어 플래너가 선택도를 잘못 판단합니다
인덱스 사용 강제하기(주의해서)
PostgreSQL에서는 힌트를 직접 지정할 수 없습니다. 대신 다음을 수행합니다:
- ANALYZE를 실행하여 통계를 새로 고칩니다
- 적절한 인덱스를 추가합니다
- 세션 설정을 지정합니다: 진단을 위해
SET enable_seqscan = off;를 사용합니다(운영 환경에서는 사용하지 마십시오)
인덱스를 사용할 수 있는 조건식
인덱스가 도움을 주려면 WHERE 절이 인덱스를 직접 비교하는 방식이어야 합니다:
-- GOOD:
WHERE created_at >= '2024-01-01'
-- BAD (function on the column):
WHERE date_trunc('day', created_at) = '2024-01-01'
-- BAD (cast):
WHERE created_at::DATE = '2024-01-01'
-- FIX: add a functional index, or rewrite with range.복합 인덱스의 순서
(a, b)에 대한 인덱스는 a만 사용하는 쿼리와 a AND b를 사용하는 쿼리를 돕지만, b만 사용하는 쿼리에는 도움이 되지 않습니다.
인덱스 크기가 중요합니다
자주 사용되는 키를 가진 좁은 B-트리 인덱스는 메모리에 완전히 들어갈 수 있지만, 넓은 인덱스는 그렇지 않을 수 있습니다. 작은 인덱스가 더 빠릅니다.
실행 계획 확인
인덱스를 추가한 후 EXPLAIN ANALYZE를 실행하여 플래너가 실제로 인덱스를 사용하는지 확인합니다. 사용하지 않는다면 원인을 자세히 조사합니다.
요약
순차 스캔과 인덱스 스캔의 선택은 선택도에 따라 결정됩니다.
- 선택적인 필터 → 인덱스 스캔
- 테이블 대부분을 읽음 → 순차 스캔
- 중간 정도에는 비트맵 스캔
- 인덱스를 사용할 수 있는 조건인지 확인
빠른 확인
PostgreSQL이 기존 인덱스 대신 순차 스캔을 선택하는 이유는 무엇일까요?
자주 묻는 질문
“순차 스캔과 인덱스 스캔” 강의는 무료인가요?
네 — “순차 스캔과 인덱스 스캔” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 SQL Academy 강의 전체를 잠금 해제할 수 있습니다. SQL Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
“순차 스캔과 인덱스 스캔”에서 뭘 배우나요?
순차 스캔이 적절한 경우와 인덱스 스캔이 필요한 경우를 알고, 플래너가 이를 어떻게 결정하는지 배워보세요. 브라우저에서 직접 실행하는 실습 코드로 SQL Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
SQL Academy을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 SQL Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 2번째 강의입니다.
“순차 스캔과 인덱스 스캔” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 SQL Academy 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 SQL Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.