출간 준비 중인 < SQL TUNER for PostgreSQL · 기본원리편 >의 미리보기입니다.
2-1-1. EXPLAIN
옵티마이저가 내부적으로 생성한 실행계획을 확인할 수 있는 방법이 있다. 바로 EXPLAIN이다. EXPLAIN은 SQL을 실제 실행하지 않고 실행계획만 출력해준다. 실제 SQL이 실행되지 않으므로 예상 실행계획이라고 할 수 있다.
아래 [SQL-2-1-1-a]와 같이 SELECT SQL 위에 EXPLAIN 키워드를 추가하여 실행해 보자.
[SQL-2-1-1-a]
EXPLAIN
SELECT t1.*
FROM startdbpg.tr_ord t1
WHERE t1.ord_no = 3;
Index Scan using tr_ord_pk on tr_ord t1 (cost=0.42..8.44 rows=1 width=54)
Index Cond: (ord_no = 3)
JavaScript
복사
[SQL-2-1-1-a]를 실행하면 SQL의 결과가 아닌 SQL의 실행계획이 출력된다. 출력된 실행계획에 대한 정보를 정리해 보면 다음과 같다.
•
Index Scan using tr_ord_pk on tr_ord t1
◦
tr_ord 테이블의 tr_ord_pk 인덱스를 Index Scan 오퍼레이션으로 처리
•
(cost=0.42..8.44 rows=1 width=54): 해당 오퍼레이션과 관련된 ‘예상’ 수치다.
◦
cost=0.42..8.44
▪
해당 오퍼레이션의 예상 처리 비용으로서 내부적인 상대적 수치다.
▪
0.42는 첫 레코드를 반환하기까지의 예상 시작 비용(startup cost)
▪
8.44는 모든 레코드를 반환 완료하기까지의 예상 총비용(total cost)
◦
rows = 1: 해당 오퍼레이션에서 출력되는 예상 레코드 수
◦
width = 54: 해당 오퍼레이션에서 출력되는 레코드별 예상 평균 크기로 바이트(byte) 단위
•
Index Cond: (ord_no = 3)
◦
Index Scan 오퍼레이션과 다른 라인에 표시되어 있지만, Index Scan의 부가 정보다.
◦
Index Scan에 사용한 조건 정보를 보여주고 있다.
2-1-1-1. 책과 다른 실행계획
이 책의 대부분 SQL은 각자 구성한 실습 환경에서 실행이 가능하다. 다만 책의 실행계획과 각자 환경의 실행계획 결과가 다를 수 있다. 이는 PostgreSQL 버전, 설정, 컴퓨터 성능, Shared Buffer 상태, 데이터 저장 순서 등의 차이로 발생하는 자연스러운 현상이다. 특히 처리 시간과 같은 수치는 환경에 따라 큰 차이가 날 수 있다. 하지만 실행계획의 주요 오퍼레이션 자체가 책과 완전히 다르다면 인덱스 생성/삭제 작업을 중간에 누락했는지 확인해 보기 바란다.
만약 인덱스가 완벽히 같은 상황에도 차이가 난다면 우선 책을 기준으로 해석하고 진도를 나가길 권한다. 물론 차이가 발생한 원인을 분석하고 실행계획을 맞춰보려는 시도는 SQL 튜닝 공부에 매우 큰 도움이 된다. 다만, 그것에 너무 매달리면 진도가 늦어지고 흥미를 잃을 수 있으니 적절한 선에서 다음 단계로 넘어가는 것이 좋다.
아래는 제미나이를 활용해 만든 강의 자료입니다.







