[업무에 바로 쓰는 SQL 튜닝] 4.2.2 사용하지 않는 함수를 포함하는 나쁜 SQL문

2024. 9. 10. 09:46CS/Database

목차

❌ 문제의 SQL 문
😎 실행 계획 살펴보기
⭕ 불필요한 IFNULL() 함수를 제거해 보자
🚀 정리

 

❌ 문제의 SQL 문

요구사항 : 사원 테이블에서 성별 기준으로 몇 명의 사원이 있는지 확인하는 쿼리문을 작성해 주세요.

SELECT IFNULL(성별, 'NO DATA') AS 성별, COUNT(*) 건수
    FROM 사원
    GROUP BY IFNULL(성별, 'NO DATA')

 

만약 성별의 값이 NULL이라면 NO DATA라고 출력할 수 있도록 IFNULL() 함수를 사용하여 구현했다.

2개의 행이 출력되었고, 약 0.12초가 소요되었다.

 

😎 실행 계획 살펴보기

I_성별_성 인덱스로 인덱스 풀 스캔 방식을 수행하며, Extra 항목이 Using temporary로 임시 테이블을 생성한다는 것을 알 수 있다.

 

음.. 여기서는 어떤 게 문제일까? 생각해 볼 포인트가 몇 가지가 있다.

1. 성별 열에 M, F 이외의 값이 존재하는가?

2. 성별 열에 NULL을 허용하는가?

 

1번 확인 : M, F 이외의 값은 들어있지 않다.

 

2번 확인 : Null 열에 NO라고 명시되어 있으므로 NULL값이 될 수 없다.

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    |       |
+--------------+---------------+------+-----+---------+-------+
6 rows in set (0.0036 sec)

따라서 IFNULL() 함수를 처리하려고 DB 내부에 별도 임시 테이블을 만들 필요가 없음을 확인했다! 불필요한 로직이므로 튜닝 대상이 되겠다.

 

⭕ 불필요한 IFNULL() 함수를 제거해 보자

소요시간이 약 0.12초에서 약 0.06초로 줄었다.

 

실행계획까지 확인해 보자

key항목이 I_성별_성 인덱스로 인덱스 풀 스캔 방식으로 수행되며, Extra항목이 Using index로 임시 테이블 없이 인덱스만 사용하는 것을 알 수 있다.

 

🚀 정리

1. 실행 계획에서 확인할 포인트

Extra 항목이 Using temporary이면 임시 테이블을 생성한다는 의미로 하나의 튜닝할 수 있는 포인트가 될 수 있음!

 

2. 함수를 사용할 때 사용하지 않아도 되는 함수는 아닐까 확인해 볼 것

 

 

 

출처 : [도서] 업무에 바로 쓰는 SQL 튜닝