선택 심화 · 현재 보류: 이 페이지의 실행계획은 원문에 제시된 예상·개념적 예시이며 이번 PostgreSQL 실측 결과가 아닙니다. SQL/인덱스 설정은 검증 후 적용해야 합니다.
상황: 하루 주문만 필요한데 테이블의 대부분을 읽는지를 확인한다.
BAD SQL — 비교 대상
SELECT COUNT(*) AS ord_cnt
FROM tr_ord_big AS o
WHERE TO_CHAR(o.ord_dtm, 'YYYYMMDD') = '20230301';
SQL
복사
GOOD SQL — 개선 후보
SELECT COUNT(*) AS ord_cnt
FROM tr_ord_big AS o
WHERE o.ord_dtm >= TIMESTAMP '2023-03-01'
AND o.ord_dtm < TIMESTAMP '2023-03-02';
SQL
복사
예상 실행계획 — 실측 아님
BAD (날짜 조건이 Index Cond가 되지 못한 가능한 형태)
Aggregate
-> Seq Scan on tr_ord_big
Filter: (to_char(ord_dtm, 'YYYYMMDD') = '20230301')
Rows Removed by Filter: [측정 시 확인]
→ 많은 후보 행을 검사할 위험
GOOD (tr_ord_big_x01(ord_dtm)이 있고 선택 시)
Aggregate
-> Index Only Scan / Index Scan using tr_ord_big_x01
Index Cond: (ord_dtm >= ... AND ord_dtm < ...)
→ 날짜 구간으로 후보 행을 줄일 가능성
Plain Text
복사
핵심
•
Seq Scan 자체가 잘못된 계획은 아니다. 필요한 행은 극히 적은데 전체 행을 확인하고 대부분 버리는지가 핵심이다.
원본 규칙: 개편 전 12-02.
참고·예외
•
Rows Removed by Filter는 필터에서 제외된 후보 건수를 보여준다. 실제로 반환된 행 수와 함께 보고, 반복된 노드라면 루프 수도 함께 확인한다. 반면 테이블의 대부분이 필요한 SQL에서는 Seq Scan이 합리적일 수 있다.



