0Pricing
SQL Academy · 강의

순차 스캔과 인덱스 스캔

순차 스캔이 적절한 경우와 인덱스 스캔이 필요한 경우를 알고, 플래너가 이를 어떻게 결정하는지 배워보세요.

순차 스캔과 인덱스 스캔은(는) 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 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. EXPLAIN과 EXPLAIN ANALYZE 읽기
  2. 순차 스캔과 인덱스 스캔
  3. 해시 조인과 병합 조인과 중첩 루프
  4. 느린 쿼리 식별 및 수정
← SQL Academy(으)로 돌아가기