SQL 튜닝을 하는데 가장 문제가 되는 것은 인덱스와 관련된 튜닝이다. 거의 대부분 각 테이블 컬럼에 인덱스를 걸어놨는데, 잘못된 조건절 사용으로 인덱스를 사용하지 못하는 경우가 정말 빈번하게 발생한다.
1. SQL 튜닝 문제 유형 - 인덱스
1) 조건절에서 비교하는 컬럼에 인덱스가 없는 경우
- 조건절에서 비교하는 컬럼에 인덱스가 없는 경우는 가장 기본적인 인덱스 튜닝 문제이다. 예를 들어, 아래의 코드를 보자.
SELECT S.NAME
FROM STUDENT
WHERE NAME = '코딩하는집사'
위의 쿼리는 STUDENT 테이블에서 NAME이 코딩하는집사인 이름을 가져오는 쿼리다. 이 경우에 STUDENT에 이름 데이터가 적으면 금방 찾을 것이다. 그런데, 네이버나 카카오 등 사용자가 많은 경우라면 데이터의 개수만큼 반복하여 풀스캔을 할 것이다. 그렇기 때문에, 이 문제는 NAME에 인덱스를 걸어서 실행 시간을 줄일 수 있다.
2) 조인 조건으로 사용된 컬럼에 인덱스가 없는 경우
- 조인은 SQL 실행 속도를 저하시키는 가장 치명적인 것이 될 수 있다. 지금 프로젝트에서도 이 문제로 SQL 튜닝을 했다. 2개의 테이블에 조인을 걸 때 공통의 데이터를 가지는 컬럼을 가지고 조인을 건다. 아래의 코드를 보자.
SELECT A.NAME
FROM COM1 A
INNER JOIN COM2 B ON A.ID = B.ID
위의 쿼리는 COM1과 COM2를 INNER JOIN으로 조인을 거는 쿼리다. 근데, 조인 조건이 각 테이블의 ID다. 이 경우에는 COM1 테이블과 COM2 테이블에서 ID를 인덱스를 걸어야 SQL 실행 속도가 크게 저하되지 않는다.
3) 서브쿼리의 조인 조건으로 사용된 컬럼에 인덱스가 없는 경우
4) 조건절에서 사용한 컬럼의 내/외부 변형으로 인덱스를 사용할 수 없는 경우
- SQL 쿼리에서 비교를 할 때, 좌변의 컬럼을 변형시키면 INDEX를 사용할 수 없다. 이건 설계 및 분석을 하는 사람들도 그렇고, 조건절에 좌변을 변형시키는 일이 거의 없다.
5) IS NULL, IS NOT NULL을 사용한 비교로 인덱스를 사용할 수 없는 경우
6) LIKE로 비교하는 값의 앞에 '%'를 사용하여 인덱스를 사용할 수 없는 경우
- LIKE를 사용할 경우에, '%문자열'를 사용하거나, '%문자열%'를 사용할 경우에는 풀스캔을 하는 경우가 굉장히 많다. 그렇기에, '%문자열'을 사용하게 되면 인덱스를 사용할 수 없다.
7) OR로 연결된 조건 비교로 인덱스를 사용할 수 없는 경우
2022년 07월 08일 v1.0 작성
참고 문헌
1. 실전사례로 살펴보는 SQL 튜닝방법(기본문법부터 최적의 성능을 발휘하는 SQL 작성까지) - 인사이트
'Language > SQL' 카테고리의 다른 글
[SQL] SQL IN EXISTS 속도 차이 (2) | 2022.08.11 |
---|---|
[SQL] SQL SELECT 쿼리문 실행순서 정리 (0) | 2022.07.17 |
[SQL] SQL 인덱스란? (3) | 2022.07.12 |
[SQL] SQL 옵티마이저란? (0) | 2022.07.10 |
[SQL] SQL 쿼리를 짤 때 주의해야 하는 것들 (0) | 2022.07.07 |
[SQL] SQL 실행계획이란? (0) | 2022.07.07 |
[SQL] SQL 튜닝이란? (0) | 2022.07.06 |
[엑셀/Excel] 엑셀(Excel)로 SQL 쿼리문 만드는 방법 (0) | 2022.04.23 |
최근댓글