❌ 문제의 SQL문
SELECT
IFNULL(성별, 'NO DATA') AS 성별,
COUNT(1) 건수
FROM 사원
GROUP BY IFNULL(성별, 'NO DATA');
📉 이게 왜 문제일까? 실행계획을 살펴보자.
- type : 인덱스 풀스캔
- Extra : Using temporary -> 임시테이블 만들어서 사용
- IFNULL() 처리를 위해 임시테이블을 만들었다.
+----+-------------+--------+------------+-------+---------------+--------------+---------+------+--------+----------+------------------------------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+--------+------------+-------+---------------+--------------+---------+------+--------+----------+------------------------------+
| 1 | SIMPLE | 사원 | NULL | index | I_성별_성 | I_성별_성 | 51 | NULL | 296854 | 100 | Using index; Using temporary |
+----+-------------+--------+------------+-------+---------------+--------------+---------+------+--------+----------+------------------------------+
하지만 아래의 desc 명령어를 통해 사원테이블을 확인해보면, 사실 성별 필드에는 NULL이 불가능한 필드라는 것을 알 수 있다.
-> 즉, 애초에 nuallable 하지 않은데 IFNULL 함수를 사용하고 있었음 -> 불필요한 임시테이블 생성하는 결과 초래
>> desc 사원;
+--------------+---------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------------+---------------+------+-----+---------+-------+
| 사원번호 | int | NO | PRI | NULL | |
| 생년월일 | date | NO | | NULL | |
| 이름 | varchar(14) | NO | | NULL | |
| 성 | varchar(16) | NO | | NULL | |
| 성별 | enum('M','F') | NO | MUL | NULL | |
| 입사일자 | date | NO | MUL | NULL | |
+--------------+---------------+------+-----+---------+-------+
⭕ 튜닝 후 SQL
SELECT
성별,
COUNT(1) AS 건수
FROM 사원
GROUP BY 성별;
📉 실행계획 확인
- Using temporary가 사라진 것을 확인할 수 있다.
+----+-------------+--------+------------+-------+---------------+--------------+---------+------+--------+----------+-------------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+--------+------------+-------+---------------+--------------+---------+------+--------+----------+-------------+
| 1 | SIMPLE | 사원 | NULL | index | I_성별_성 | I_성별_성 | 51 | NULL | 296854 | 100 | Using index |
+----+-------------+--------+------------+-------+---------------+--------------+---------+------+--------+----------+-------------+
🎯정리
함수를 사용할 때에는 사용하지 않아도 되는 함수는 아닐까 라고 한번 생각해보자.
그리고 Extra의 Using temporary가 있다면 튜닝할 수 있는 포인트라고 생각하고 확인해보면 좋을 것 같다.
[스터디 교재]
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-1 기본키를 변형하는 나쁜 SQL문 (1) | 2024.09.24 |
[업무에 바로쓰는 SQL 튜닝] 3장. 실행 계획 수행[작성중] (1) | 2024.09.13 |
[업무에 바로 쓰는 SQL 튜닝 ] 2장. 물리 엔진과 오브젝트 용어 (1) | 2024.09.11 |