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

[SQL 튜닝] 사용하지 않는 함수를 포함하는 나쁜 SQL 문

by Johnny's 2023. 7. 10.

사용하지 않는 함수를 포함하는 나쁜 SQL 문

현황 분석

튜닝 전 실행 계획 |

사원 테이블에서 성별 기준으로 몇 명의 사원이 있는지 출력하는 쿼리

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

- 사원 테이블 컬럼 수 : 300024 (약 30만건)

- SQL문 결과 : 총 2건의 결과 출력, 115ms 소요

   M(남) - 179973, F(여) - 120051

- 성별의 값이 NULL 이면 NO DATA 출력 (IFNULL 처리)

- Key 항목 :  I_성별_성 인덱스로 나타나므로 인덱스 풀 스캔 방식으로 수행

- Extra 항목 : Using temporary 이므로 임시테이블을 생성

 

튜닝 수행

사원 테이블의 성별 열에는 Null 값이 존재하지 않고, M(남)과 F(여)라는 데이터만 저장

DESC 사원;

- 성별 열에는 NOT NULL 속성 설정

- NULL : NO → Null 값이 될 수 없다고 해석

- IFNULL() 함수를 처리하려고 DB 내부적으로 별도의 임시 테이블을 만들어서 Null 값의 여부를 검사할 필요 없음

- 성별 열에는 Null 값이 존재할 수 없음 → Null 값의 입력을 방어하는 불필요한 로직은 튜닝 대상

 

튜닝 결과

| 튜닝 후 실행 계획 |

IFNULL() 함수 제거, 성별 열만 그대로 사용하여 튜닝

EXPLAIN
SELECT 성별, COUNT(1) 건수
	FROM 사원
GROUP BY 성별;

115ms → 46.8ms (속도 개선)

Key : I_성별_성 (인덱스 풀 스캔 방식 수행)

Extra : Using Index (임시 테이블 없이 인덱스만 사용하여 데이터 추출)

 

* 참고

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

댓글