BAD: 0.864ms, hit=731, read=0
필요 없는 컬럼까지 전체 조회
SELECT o.*
FROM startdbpg.tr_ord_big o
WHERE o.mbr_id = 'M00001'
;
SQL
복사
실행계획 보기
•
화면에는 주문번호와 회원 ID만 필요한데 전체 컬럼을 조회했습니다.
•
인덱스로 대상 행을 찾은 뒤, 인덱스에 없는 나머지 컬럼을 가져오려고 테이블까지 읽습니다(Index Scan).
GOOD: 0.280ms, hit=17, read=0
필요한 컬럼만 조회
SELECT o.ord_no
,o.mbr_id
FROM startdbpg.tr_ord_big o
WHERE o.mbr_id = 'M00001'
;
SQL
복사
실행계획 보기
•
조회하는 ord_no, mbr_id가 모두 인덱스(tr_ord_big_x43)에 들어 있습니다.
•
그래서 테이블을 읽지 않고 인덱스만으로 결과를 만듭니다(Index Only Scan).
•
읽은 양(hit)이 731에서 17로 줄었습니다.
KEY POINT
•
SELECT * 대신 필요한 컬럼만 적습니다.
•
조회하는 컬럼이 모두 인덱스에 있으면, 테이블을 읽지 않고 끝납니다. 실행계획에는 Index Only Scan으로 나타납니다.
•
주의: Index Only Scan을 노리고 인덱스를 구성해서는 안 됩니다. 이 예시는 성능 차이를 보여주려고 Index Only Scan을 유도했을 뿐입니다. 우리가 가져야 할 자세는 필요한 컬럼만 기술하는 것입니다.
DEEP DIVE — SQL TUNER for PostgreSQL 기본원리편

