반응형

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 작성까지) - 인사이트

반응형
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기