본문 바로가기
SQL 튜닝/SQL 문 재작성

[SQL 튜닝] 필요 이상으로 많은 정보를 가져오는 나쁜 SQL 문

by Johnny's 2023. 7. 28.

필요 이상으로 많은 정보를 가져오는 나쁜 SQL 문

현황 분석

튜닝 전 실행 계획 |

사원 테이블에서 성별이 M(남)이고, 사원번호300,000을 초과하는 사원 대상으로 부서관리자 테이블과 외부 조인을 수행한 뒤, 해당하는 사원번호의 개수를 출력하는 쿼리

SELECT COUNT(사원번호) AS 카운트
	FROM (
		SELECT 사원.사원번호, 부서관리자.부서번호
		FROM (SELECT *
			 	FROM 사원
			 	WHERE 성별 ='M' AND 사원번호 > 300000
			) 사원
			LEFT JOIN 부서관리자
			ON 사원.사원번호 = 부서관리자.사원번호
			) 서브쿼리
            
 /* 실행계획 */
EXPLAIN
SELECT COUNT(사원번호) AS 카운트
	FROM (
		SELECT 사원.사원번호, 관리자.부서번호
		FROM (SELECT *
			 	FROM 사원
			 	WHERE 사원번호 > 300000
			) 사원
			LEFT JOIN 부서관리자 관리자
			ON 사원.사원번호 = 관리자.사원번호
			) 서브쿼리;

- SQL문 결과 : 총 1건의 결과(60,108) 출력, 81.5ms 소요

- 드라이빙 테이블 : 사원 테이블, 드리븐 테이블 : 부서관리자 테이블

- 사원 테이블 : 사원번호 > 300000 조건 범위 스캔(type 항목 : range) 수행, 기본 키(key 항목: PRIMARY) 활용

- 부서관리자 테이블 : 사원.사원번호 = 관리자.사원번호의 외부 조인에 따라 키본 키를 활용하여 중첩 루프 조인할 때마다 1건의 데이터(rows 항목 : 1)에 접근

 

튜닝 수행

- 최종 결과로 사원 테이블의 사원번호 데이터 건수를 집계

- 부서관리자 테이블과 외부 조인하는 사원.사원번호 = 관리자.사원번호 조건이 꼭 필요한지 고민

 

튜닝 결과

튜닝 후 실행 계획 |

최종적으로 필요한 사원번호의 건수를 구하는 과정에서 부서관리자 테이블은 필요 없음

부서관리자 테이블과 관련된 부분을 제거하고 사원 테이블의 데이터에만 접근하도록 SQL 문을 간소화

EXPLAIN			
SELECT COUNT(사원번호) AS 카운트
	FROM 사원
WHERE 성별 = 'M' AND 사원번호 > 300000;

- 81.5ms → 28.3ms (시간 단축)

- 불필요한 연산 제거 (부서관리자 테이블 연산 작업)

- rows 항목 : 약 15만건 → 약 5만 건의 데이터에만 접근

 

* 참고

- 업무에 바로쓰는 SQL 튜닝(도서) - 5장 악성 SQL 튜닝으로 전문가 되기

댓글