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

[SQL 튜닝] 범위 조건으로 인덱스를 사용하는 나쁜 SQL 문

by Johnny's 2023. 7. 18.

범위 조건으로 인덱스를 사용하는 나쁜 SQL 문

현황 분석

튜닝 전 실행 계획 |

입사일자1994년 1월 1일부터 2000년 12월 31일까지인 사원들의 이름과 성을 출력하는 쿼리

EXPLAIN
SELECT 이름, 성
	FROM 사원
WHERE 입사일자 BETWEEN STR_TO_DATE('1994-01-01', '%Y-%m-%d')
	AND STR_TO_DATE('2000-12-31', '%Y-%m-%d');

 

- SQL문 결과 : 총 48,875건의 결과 출력, 116 ms 소요

 

튜닝 수행

SELECT COUNT(1) FROM 사원;

- 사원 테이블 : 총 데이터 300,024건 (튜닝 전 SQL 문의 결과 건수 48,875 건 - 약 17%)

- 인덱스를 사용하는 것이 효율적일지, 아니면 인덱스 없이 테이블에 바로 접근하는 방식이 효율적일지 확인

- 입사일자 열 기준으로 매번 수 년에 걸친 데이터를 조회하는 경우가 잦다면, 인덱스 스캔으로 랜덤 액세스의 부하가 발행하도록 하기 보다는 테이블 풀 스캔 방식을 고정적으로 설정하는 것이 나음

 

튜닝 결과

튜닝 후 실행 계획 |

입사일자 열생성한 인덱스를 사용하지 않게 의도적으로 인덱스 열을 변형한 쿼리

EXPLAIN
SELECT 이름, 성
	FROM 사원
WHERE YEAR(입사일자) BETWEEN '1994' AND '2000';

type 항목 : ALL 로 수행 → 테이블 풀 스캔 방식으로 데이터 접근

인덱스 없이 테이블에 직접 접근하며 한 번에 다수의 페이지에 접근하므로 더 효율적

 

* 참고

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

댓글