SQL 튜닝(성능 개선)을 위해 가장 먼저 할 일은 실행계획을 살펴보는 것입니다. 우리가 작성해서 실행한 SQL은 DBMS 내부적으로 실행계획이라는 처리 절차서를 만들어 SQL을 처리합니다. PG에서 실행계획은 SQL 위에 EXPLAIN 구문을 적어 확인 할 수 있습니다.
아래와 같이 EXPLAIN과 함께 SQL을 실행하면, SQL의 결과가 아닌 실행계획이 출력됩니다. 실행계획을 통해 SQL이 어떻게 처리될지를 알 수 있으며, 이에 따라 성능 저하가 될 만한 부분을 확인할 수 있습니다.
EXPLAIN
EXPLAIN
SELECT t1.*
FROM tr_ord_big t1
WHERE t1.ord_no = 3;
Seq Scan on tr_ord_big t1 (cost=0.00..379081.51 rows=1 width=56)
Filter: (ord_no = '3'::numeric)
JIT:
Functions: 2
Options: Inlining false, Optimization false, Expressions true, Deforming true
SQL
복사
실행계획의 가장 첫 번째 라인에는 SeqScan이, 다음 라인에는 Filter가 표시되어 있습니다. 두 단계를 종합해보면 다음과 같이 설명할 수 있습니다.
•
SeqScan on tr_ord_big t1: tr_ord_big(t1) 테이블을 FULL SCAN합니다.
◦
FULL SCAN이란, 테이블의 데이터 전체를 검색함을 뜻합니다.
◦
테이블에 100메가의 데이터가 입력되어 있다면 100메가의 데이터 모두를 검색하게 됩니다.
•
Filter: 부모 단계인 SeqScan에서 데이터를 검색하는 조건을 뜻합니다.
◦
FULL SCAN을 하면서 ord_no가 3인 데이터를 찾습니다.
위 SQL로 얻은 실행계획은 예상 실행계획입니다. 그러므로 실행계획에 포함된 아래의 수치들은 예상 수치입니다.
•
cost: SQL 실행 비용의 추정치, 시작수치..종료수치로 구성됩니다.
•
rows: 예상되는 추출 레코드 수
•
width: 예상되는 하나의 레코드의 크기(넓이)
PG 버젼과 설정에 따라 JIT관련 정보가 같이 출력됩니다. JIT는 Just In Time의 약어로서, SQL의 일부를 기계어로 변환해 처리해 실행 시간을 향상시키는 기능입니다. 다만, 직접적으로 컨트롤하기는 어려우며, SQL 구문의 튜닝과는 거리가 있습니다. 이 강의(교재)에서는 JIT 관련 주제는 다루지 않습니다. 앞으로도 실행계획에서 관련 내용은 생략합니다. JIT와 관련된 내용은 아래 레퍼런스를 참고해주세요.
간단히 실행계획에 대해 살펴봤습니다.