본문 바로가기
전공공부

SQL 튜닝을 위한 6가지 기본 방법

by 시아나 2026. 4. 11.

안녕하세요
지난 포스트에서는 쿼리튜닝이 무엇이고
쿼리 실행 계획(Query Plan)을 어떻게 보는지에 대해 알아봤습니다.

 

쿼리 튜닝에 대하여(기초)

이번 프로젝트에서 쿼리를 다룰일이 많다. DB를 많이 사용하다보니 select할 때 시간이 많이 걸리기 때문에 쿼리튜닝이 필수였다.쿼리튜닝은 DBA가 해주지만 DBA가 바빠서 그런지 응답 시간이 오래

ytlive.tistory.com

 

이번 포스트에서는 지난 포스트에 이어서
SQL 튜닝을 위한 6가지 방법에 대해 알아보도록 하겠습니다.

 


 

쿼리 튜닝의 기본원칙 6가지

 

쿼리 튜닝을 하는 방법은 다양하지만
많이 알려져 있는 6가지 방법을 소개시켜드리려고 합니다.

간단하게 먼저 말씀드리자면

1. 좌변 가공 지양
2. 복잡한 WHERE절 OR 대신 UNION 사용
3. 필요한 Row, Column만 사용
4. 분석 함수를 최대한 활용
5. 와일드카드(%) 는 끝에 작성
6. 복잡한 계산값을 미리 저장해두고, 나중에 사용


이렇게 6가지 방법이 있습니다.

 

성, 이름, 월급, 날짜, 지역의 컬럼이 있는 Employee 테이블이 있다고 가정하고
예시를 들어 하나씩 설명드리겠습니다.

 

 

1. 좌변 가공 지양

데이터베이스는 데이터 원본을 기준으로 인덱스(정렬)를 만듭니다.

만약 데이터를 가공하여 조회하는 연산을 사용하면
미리 만들어둔 인덱스를 제대로 활용할 수 없게됩니다.

예를들어 데이터 중에 2026년 데이터만 조회하고 싶을 경우에는

SELECT * FROM employee
WHERE YEAR(date) = 2025;

이런 쿼리를 사용하면 date에 걸려있는 인덱스를
사용하지 못하게 됩니다. 

쿼리를 실행해보면 type이 ALL로 전체 조회하는 것을  볼 수 있습니다.

한줄 한줄 조회하면서 Year 연산을 수행하고
결과를 2025와 비교해서 조회하는 것입니다.

위 쿼리 대신 아래 쿼리를 사용하면 더 빠르게 조회할 수 있습니다.

SELECT name FROM employee
WHERE date >= '2025-01-01' AND date <= '2025-12-31';

 

이 쿼리는 데이터를 변형하지 않기 때문에
인덱스를 활용하여 빠르게 조회할 수 있습니다.

즉 인덱스를 최대한 활용하기 위해서는
WHERE 절에서 원본 데이터를 비교하는 조건을 사용하는 것이 좋습니다.

좌변 대신 우변을 가공하는 것입니다.

 

 

2. 복잡한 WHERE절 OR 대신 UNION 사용

OR 대신 UNION 연산자를 사용하는 것이 더 빠릅니다.

인덱스는 기본적으로 단일 값에 대한 빠른 검색에 최적화 되어있지만
OR여러값을 동시에 찾아야 되기 때문에 인덱스를 제대로 활용할 수 없습니다.

때문에 OR 대신 UNION을 사용하는 것이 좋습니다.

UNION은 각 조건에 대한 쿼리를 별도로 실행한 후 합쳐주기 때문에
각 연산이 인덱스를 활용할 수 있습니다.

SELECT * FROM employee
WHERE family = '김' OR region = '서울';

이 쿼리에서는 성이 김씨인 것과 지역이 서울인 것 둘다 동시에 조회해야 되기 때문에
인덱스를 사용하지 않고 전체를 조회합니다.

제가 사용한 DBMS에서는 DB가 알아서 최적화 해줘서
index_merge로 타입이 나타나네요.

SELECT * FROM employee WHERE family = '김'
UNION
SELECT * FROM employee WHERE region = '서울';

이 쿼리를 사용하면 성이 김씨인 데이터와
서울 사람인 데이터를 각각 조회해서 합치게 됩니다.

 

 

3. 필요한 Row, Column만 사용

데이터베이스에서 데이터를 조회할 때 필요한 데이터만 조회해 오는 것은
응답시간을 줄이는 가장 쉬운 방법 중 하나입니다.

SELECT * FROM DB2

SELECT * 대신 필요한 컬럼만 조회해 오는 것만으로
가독성과 효율성 두가지 토끼를 잡을 수 있습니다.

SELECT name, salary FROM employee where salary > 1000;

 

 

4. 분석 함수를 최대한 활용

분석 함수(Analytic Functions)는 SQL 쿼리의 성능을 높일 수 있는 도구입니다.
대표적으로 ROW_NUMBER(), RANK(), DENSE_RANK(), LEAD(), LAG() 등의 함수가 있습니다.

해당 함수는 윈도우 함수(Window Function) 라고도 불리는데
Group by를 할 필요가 없어서 집계함수를 사용하는 것보다 효율적입니다.

SELECT name, salary FROM employee e
WHERE salary = (
	SELECT MAX(salary) FROM employee m 
    WHERE e.id = m.id
);

윈도우 함수를 사용하지 않으면 
부서별 최고 급여자를 찾기 위해 총 2번 테이블을 조회해야 했습니다.

SELECT name, salary FROM (
  SELECT name, salary
  , RANK() OVER(PARTITION BY id ORDER BY salary DESC) as rnk
  FROM employee
) t WHERE rnk = 1;

하지만 윈도우 함수를 사용하면
테이블을 1번만 조회해도 되기 때문에 효율적입니다.

쿼리 플랜에서 실제로 테이블을 조회하는 것인 ID 2로,
ID1에서 <derived2>라는 임시 공간을 만들어서 ID2에서 조회합니다.

 

 

5. 와일드카드(%) 는 끝에 작성

Like 함수를 사용할 때 %의 위치도 쿼리 성능을 좌우합니다.

%가 앞에 붙게 된다면
인덱스의 정렬 순서를 사용할 수 없어 전체를 조회해야 합니다.

SELECT * FROM Employee
WHERE name LIKE '%김' -- FULL SCAN

때문에 %는 조회할 문자열 뒤에 붙이는 것이 좋습니다.

SELECT * FROM Employee
WHERE name LIKE '김%' -- Index Scan

%를 뒤에 붙이니 index를 타는 것을 볼 수 있습니다.

 

 

6. 복잡한 계산값을 미리 저장해두고, 나중에 사용

자주 사용하는 복잡한 계산값은
별도의 컬럼이나 테이블에 저장해두고 조회해서 사용하는 것이 좋습니다.

주로 통계값 같은 데이터가 이에 포함됩니다.

만약에 다양한 통계치를 실시간으로 계산한다면 실행 될 때마다
많은 양의 데이터를 조회해서 복잡한 계산을 해야되기 때문에 성능이 떨어질 수 밖에 없습니다.

 

 

 


 

 

지금까지 가장 기본적인
기본 쿼리 튜닝 방법 6가지에 대해 알아봤습니다.

 

감사합니다.

 

 

참고

https://tech.wonderwall.kr/articles/improvementfeedpost/

https://community.heartcount.io/ko/query-optimization-tips/