반응형
SMALL
사용하지 않는 함수를 포함하는 나쁜 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 (임시 테이블 없이 인덱스만 사용하여 데이터 추출)
* 참고
반응형
LIST
'SQL 튜닝 > SQL 문 단순 수정' 카테고리의 다른 글
[SQL 튜닝] 다수 쿼리를 UNION 연산자로만 합치는 나쁜 SQL 문 (0) | 2023.07.14 |
---|---|
[SQL 튜닝] 습관적으로 중복을 제거하는 나쁜 SQL 문 (0) | 2023.07.13 |
[SQL 튜닝] 열을 결합하여 사용하는 나쁜 SQL 문 (0) | 2023.07.12 |
[SQL 튜닝] 형변환으로 인덱스를 활용하지 못하는 나쁜 SQL 문 (0) | 2023.07.11 |
[SQL 튜닝] 기본 키를 변형하는 나쁜 SQL 문 (0) | 2023.07.08 |
댓글