본문 바로가기
SQL 튜닝/SQL 문 단순 수정

[SQL 튜닝] 습관적으로 중복을 제거하는 나쁜 SQL 문

by Johnny's 2023. 7. 13.

습관적으로 중복을 제거하는 나쁜 SQL 문

현황 분석

튜닝 전 실행 계획 |

부서 관리자사원번호와 이름, 성, 부서번호 데이터를 중복 제거하여 조회하는 쿼리

EXPLAIN
SELECT DISTINCT 사원.사원번호, 사원.이름, 사원.성, 부서관리자.부서번호
	FROM 사원
	JOIN 부서관리자
	ON (사원.사원번호 = 부서관리자.사원번호);

- 부서 관리자 테이블 컬럼 수 : 24

- SQL문 결과 : 총  24건의 결과 출력, 0.4ms 소요

- 드라이빙 테이블인 부서관리자 테이블드리븐 테이블인 사원 테이블id 값 둘다 1로 동일하게 나타남 → 서로 조인

- 부서관리자 테이블의 type 항목 : index인덱스 풀 스캔 방식 수행

- 사원 테이블의 type 항목 : eq_ref → 사원번호라는 기본 키를 사용해서 단 1건의 데이터를 조회하는 방식으로 조인됨

- DISTINCT를 수행하고자 별도의 임시테이블(Extra 항목 : Using temporary)을 만들고 있음

 

튜닝 수행

사원 테이블의 키본 키 : 사원번호 → SELECT 절에 작성된 사원.사원번호에는 중복된 데이터가 없음

굳이 DISTINCT라는 키워드로 정렬 작업을 하고 중복을 제거하는 작업이 불필요

 

TIP DISTINCT 구문 안의 숨은 작업
DISTINCT 키워드는 나열된 열들을 정렬한 뒤 중복된 데이터를 삭제 

DISTINCT를 쿼리에 작성하는 것만으로도 정렬 작업이 포함된을 인지해야 함
이미 정렬된 키본 키나 인덱스를 활용하는 경우라면 정렬 작업의 부담은 덜 수 있음

 

튜닝 결과

| 튜닝 후 실행 계획 |

사원 테이블의 사원번호 열이 키본 키라서 중복된 데이터가 출력될 수 없으므로 DISTINCT 키워드 제거

EXPLAIN
SELECT 사원.사원번호, 사원.이름, 사원.성, 부서관리자.부서번호
	FROM 사원
	JOIN 부서관리자
	ON (사원.사원번호 = 부서관리자.사원번호);

0.4ms → 0.4ms (변화 없음) → 데이터가 수십 건 밖에 안되서 소요 시간을 기준으로 튜닝 여부를 판단하기 어려움

extra 항목 : Using temporary 삭제

임시 테이블에서 정렬과 중복제거를 수행하지 않아도 되므로 불필요한 작업을 제거하여 튜닝 완료

 

* 참고

- 업무에 바로쓰는 SQL 튜닝(도서) - 4장 악성 SQL 튜닝으로 초보자 탈출하기

댓글