❌ 문제의 SQL문
select
distinct 사원.사원번호,
사원.이름,
사원.성,
부서관리자.부서번호
from 사원
join 부서관리자 on (사원.사원번호 = 부서관리자.사원번호);
📉 이게 왜 문제일까? 실행계획을 살펴보자.
- id가 모두 1인것으로 보아 join한 관계이다.
- 부서관리자 type : index -> 풀스캔
- 사원 테이블 type : eq_ref -> 사원 테이블의 기본키(사원번호)를 사용
- Extra : Using temporary -> distct를 위한 별도의 임시테이블 사용
+----+-------------+-----------------+------------+--------+---------------+----------------+---------+-------------------------------------+------+----------+------------------------------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+-----------------+------------+--------+---------------+----------------+---------+-------------------------------------+------+----------+------------------------------+
| 1 | SIMPLE | 부서관리자 | NULL | index | PRIMARY | I_부서번호 | 12 | NULL | 24 | 100 | Using index; Using temporary |
| 1 | SIMPLE | 사원 | NULL | eq_ref | PRIMARY | PRIMARY | 4 | tuning.부서관리자.사원번호 | 1 | 100 | NULL |
+----+-------------+-----------------+------------+--------+---------------+----------------+---------+-------------------------------------+------+----------+------------------------------+
사원 테이블의 사원번호는 기본키이다.
즉, 중복이 없는 사원번호인지 distinct를 불필요하게 사용하고 있다.
distinct를 사용하면 내부적으로 임시테이블을 통해 정렬을 수행한다.
그리고 정렬된 데이터에서 중복데이터를 찾아 삭제하는 과정을 거친다.
결국 distinct가 불필요하게 사용되었다면 피해야한다.
⭕ 튜닝 후 SQL문
select
사원.사원번호,
사원.이름,
사원.성,
부서관리자.부서번호
from 사원
join 부서관리자 on (사원.사원번호 = 부서관리자.사원번호);
📉 실행 계획 확인
- Using temporary 삭제 -> distinct를 제거함으로써 불필요한 임시테이블 사용이 사라졌다.
+----+-------------+-----------------+------------+--------+---------------+----------------+---------+-------------------------------------+------+----------+-------------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+-----------------+------------+--------+---------------+----------------+---------+-------------------------------------+------+----------+-------------+
| 1 | SIMPLE | 부서관리자 | NULL | index | PRIMARY | I_부서번호 | 12 | NULL | 24 | 100 | Using index |
| 1 | SIMPLE | 사원 | NULL | eq_ref | PRIMARY | PRIMARY | 4 | tuning.부서관리자.사원번호 | 1 | 100 | NULL |
+----+-------------+-----------------+------------+--------+---------------+----------------+---------+-------------------------------------+------+----------+-------------+
🎯 정리
distinct는 내부적으로 임시테이블을 생성하고, 정렬하는 과정이 추가된다.
만약 중복되지 않는 데이터에 distinct 를 사용하지 않았는지 확인하자.
[스터디 교재]
https://product.kyobobook.co.kr/detail/S000001810409
'스터디 > 업무에 바로 쓰이는 SQL 튜닝' 카테고리의 다른 글
[업무에 바로 쓰는 SQL 튜닝] 4-4 열을 결합하여 사용하는 나쁜 SQL문 (1) | 2024.09.30 |
---|---|
[업무에 바로 쓰는 SQL 튜닝] 4-3 형변환으로 인덱스를 활용하지 못하는 나쁜 SQL 문 (0) | 2024.09.27 |
[업무에 바로 쓰는 SQL 튜닝] 4-2 사용하지 않는 함수를 포함하는 나쁜 SQL문 (0) | 2024.09.27 |
[업무에 바로 쓰는 SQL 튜닝] 4-1 기본키를 변형하는 나쁜 SQL문 (1) | 2024.09.24 |
[업무에 바로쓰는 SQL 튜닝] 3장. 실행 계획 수행[작성중] (1) | 2024.09.13 |