❌ 문제의 SQL문
아래는 사용 여부가 1인 급여 개수를 구하는 쿼리이다.
약 42000개가 탐색됨.
select count(1)
from 급여
where 사용여부 = 1;
금여 테이블과 인덱스는 아래와 같이 설정되어 있다.
인덱스
- 사원번호 + 시작일자 PK
- 사용여부
📉 이게 왜 문제일까? 실행계획을 살펴보자.
- key : 사용여부 항목을 인덱스로 사용함.
- type : index → 인덱스 풀 스캔
- rows : 283만
- 사실상 모든 인덱스 테이블 행을 탐색했음.
- filterd : 10 → 엔진으로부터 가져온 데이터 중 10%를 추출해서 최종 데이터를 출력할 예정.
+----+-------------+--------+------------+-------+----------------+----------------+---------+------+---------+----------+--------------------------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+--------+------------+-------+----------------+----------------+---------+------+---------+----------+--------------------------+
| 1 | SIMPLE | 급여 | NULL | index | I_사용여부 | I_사용여부 | 4 | NULL | 2838065 | 10 | Using where; Using index |
+----+-------------+--------+------------+-------+----------------+----------------+---------+------+---------+----------+--------------------------+
⭕ 튜닝 후 SQL문
형변환을 하지 않도록 아래와 같이 수정한다.
select count(1)
from 급여
where 사용여부 = '1';
📉 실행 계획 확인
rows를 보면 기존 300만개에서 8만개로 줄어들었음을 확인할 수 있다.
-> 형변환 필요가 없기 때문에 모든 데이터를 확인하지 않고, 인덱스를 통해서 조건데이터만 확인했다.
+----+-------------+--------+------------+------+----------------+----------------+---------+-------+-------+----------+-------------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+--------+------------+------+----------------+----------------+---------+-------+-------+----------+-------------+
| 1 | SIMPLE | 급여 | NULL | ref | I_사용여부 | I_사용여부 | 4 | const | 82824 | 100 | Using index |
+----+-------------+--------+------------+------+----------------+----------------+---------+-------+-------+----------+-------------+
🎯 정리
데이터의 유형에 맞게 열을 사용해야 한다.
즉, 내부적인 형변환이 이루어지지 않도록 해야하고, 형변환으로 인해 인덱스를 제대로 활용하지 못하는 경우가 있을 수 있으니 주의하자.
[스터디 교재]
https://product.kyobobook.co.kr/detail/S000001810409
'스터디 > 업무에 바로 쓰이는 SQL 튜닝' 카테고리의 다른 글
[업무에 바로 쓰는 SQL 튜닝] 4-5 습관적으로 중복을 제거하는 나쁜 SQL 문 (0) | 2024.10.03 |
---|---|
[업무에 바로 쓰는 SQL 튜닝] 4-4 열을 결합하여 사용하는 나쁜 SQL문 (1) | 2024.09.30 |
[업무에 바로 쓰는 SQL 튜닝] 4-2 사용하지 않는 함수를 포함하는 나쁜 SQL문 (0) | 2024.09.27 |
[업무에 바로 쓰는 SQL 튜닝] 4-1 기본키를 변형하는 나쁜 SQL문 (1) | 2024.09.24 |
[업무에 바로쓰는 SQL 튜닝] 3장. 실행 계획 수행[작성중] (1) | 2024.09.13 |