Search

REMINDER 11-01. Index Cond와 Filter를 구분하자

⚠️
선택 심화 · 현재 보류: 이 페이지의 실행계획은 원문에 제시된 예상·개념적 예시이며 이번 PostgreSQL 실측 결과가 아닙니다. SQL/인덱스 설정은 검증 후 적용해야 합니다.
상황: 특정 매장 S281의 2022년 11월 픽업 완료 주문을 조회한다.

BAD SQL — 비교 대상

-- 비교 기준: 매장만 검색할 수 있는 인덱스 -- 제공 실습: tr_ord_big_x02 (shop_id) SELECT o.ord_no, o.ord_dtm FROM tr_ord_big AS o WHERE o.shop_id = 'S281' AND o.ord_st = 'PKUP' AND o.pkup_dtm >= TIMESTAMP '2022-11-01' AND o.pkup_dtm < TIMESTAMP '2022-12-01';
SQL
복사

GOOD SQL — 개선 후보

-- 같은 SQL, 인덱스 설계를 검토한다. -- 아래 DDL은 교육용 '추가 후보'이며 실제 생성하지 않았음 CREATE INDEX tr_ord_big_review01 ON tr_ord_big (shop_id, ord_st, pkup_dtm); SELECT o.ord_no, o.ord_dtm FROM tr_ord_big AS o WHERE o.shop_id = 'S281' AND o.ord_st = 'PKUP' AND o.pkup_dtm >= TIMESTAMP '2022-11-01' AND o.pkup_dtm < TIMESTAMP '2022-12-01';
SQL
복사
예상 실행계획 — 실측 아님
[x02(shop_id) 선택 시 가능한 계획] Index Scan using tr_ord_big_x02 on tr_ord_big Index Cond: (shop_id = 'S281') Filter: (ord_st = 'PKUP' AND pkup_dtm >= ... AND pkup_dtm < ...) → shop_id로 찾은 후보 행에서 다른 조건을 확인 [review01 선택 시 가능한 계획] Index Scan using tr_ord_big_review01 on tr_ord_big Index Cond: (shop_id = 'S281' AND ord_st = 'PKUP' AND pkup_dtm >= ... AND pkup_dtm < ...) → 세 조건이 인덱스 검색에 함께 활용될 수 있음
Plain Text
복사

핵심

•
Index Cond는 인덱스로 검색·검사하는 조건, Filter는 스캔 노드의 추가 필터다. 인덱스 컬럼이 아닌 조건 때문에 많은 후보 행에 접근한다면 인덱스 구성을 점검해야 한다.
원본 규칙: 개편 전 04-01.
💡
참고·예외
•
Filter가 있다고 해서 무조건 느린 SQL은 아니다. 컬럼 변형·표현식과 접근 방식에 따라 Filter가 테이블 이전에 검사되는 경우도 있다. 교육용 신규 인덱스를 적용할지는 쓰기 부하·공간·다른 SQL까지 고려해 결정한다.