2024. 9. 10. 09:46ㆍCS/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 튜닝
'CS > Database' 카테고리의 다른 글
[업무에 바로 쓰는 SQL 튜닝] 4.2.4 열을 결합하여 사용하는 나쁜 SQL 문 (0) | 2024.10.02 |
---|---|
[업무에 바로 쓰는 SQL 튜닝] 4.2.3 형변환으로 인덱스를 활용하지 못하는 나쁜 SQL 문 (0) | 2024.09.13 |
[업무에 바로 쓰는 SQL 튜닝] 4.2.1 기본키를 변형하는 나쁜 SQL문 (0) | 2024.09.08 |
[토이프로젝트] Mysql Workbench에서 Database 생성 및 연결하기 (0) | 2022.11.06 |
SELECT 기초 - 원하는 정보 가져오기 (0) | 2022.05.11 |