Search

REMINDER 02-01. SELECT 절에는 필요한 컬럼만 사용하자

상황: 닉네임이 'Moon'인 회원의 ID와 닉네임만 필요하다. 사용 가능한 인덱스는 ms_mbr_x51 (nick_nm) INCLUDE (mbr_id)이다.

BAD SQL

EXPLAIN (ANALYZE, BUFFERS, COSTS OFF) SELECT m.* FROM startdbpg.ms_mbr m WHERE m.nick_nm = 'Moon';
SQL
복사
Index Scan using ms_mbr_x51 on ms_mbr m (actual time=0.664..0.665 rows=1 loops=1) Index Cond: ((nick_nm)::text = 'Moon'::text) Buffers: shared hit=1 read=2 Planning: Buffers: shared hit=102 read=1 Planning Time: 1.955 ms Execution Time: 0.812 ms
Plain Text
복사
실측 실행계획
•
SELECT *는 필요한 두 컬럼 외의 컬럼까지 조회한다.
•
이번 사례에서는 인덱스에 없는 컬럼을 가져오기 위해 테이블 접근이 발생한다. 그만큼 추가 I/O 비용을 부담할 수 있다.

GOOD SQL

EXPLAIN (ANALYZE, BUFFERS, COSTS OFF) SELECT m.mbr_id ,m.nick_nm FROM startdbpg.ms_mbr m WHERE m.nick_nm = 'Moon';
SQL
복사
실측 실행계획
Index Only Scan using ms_mbr_x51 on ms_mbr m (actual time=0.077..0.079 rows=1 loops=1) Index Cond: (nick_nm = 'Moon'::text) Heap Fetches: 0 Buffers: shared hit=3 Planning: Buffers: shared hit=82 Planning Time: 0.544 ms Execution Time: 0.169 ms
Plain Text
복사
•
필요한 두 컬럼이 모두 인덱스에 포함되어 Index Only Scan으로 처리되었다.
•
이번 실측에서는 Heap Fetches: 0으로 테이블 접근 없이 조회했다.

핵심

•
서비스 SQL에서는 필요한 컬럼만 명시하는 습관을 갖자. SELECT *를 기본값처럼 사용하지 말자.
•
실제 테이블 접근 여부와 관계없이, 업무에서 사용하지 않는 컬럼은 조회하지 않는 것이 기본 작성 원칙이다.
💡
참고
•
Index Only Scan도 Visibility Map 상태에 따라 Heap Fetches가 발생할 수 있다.
•
실측 실행시간은 BAD 0.812ms, GOOD 0.169ms였으나 단일 실행 결과이므로 일정한 성능 향상 비율을 일반화하지 않는다.