DataBase/이론&SQL

[SQL]간단하면서 쉬운 쿼리 최적화 방법

DevStory 2022. 4. 15.

쿼리 최적화는 상당히 어려우며 복잡합니다. 최적화되지 않은 쿼리는 CPU, 메모리를 불필요하게 소모하고 서비스를 사용하는 사용자에게 불편함을 제공합니다. 하지만 초급 개발자가 쿼리를 최적화하기 위해 실행 계획을 분석하는 것은 굉장히 어렵습니다.

 

이번 포스팅은 저처럼 초급 개발자가 수행할 수 있는 쿼리 최적화 방법을 소개합니다.


1. SELECT * 사용 금지

쿼리를 최적화하는 가장 쉬운 방법으로 필요한 칼럼만 조회하는 것입니다. 아스타리스크(*)를 사용하여 필요하지 않은 칼럼을 조회해야 하는 경우 불필요하게 리소스를 소모합니다.


2. LIKE 검색시 와일드카드(%) 끝에 작성

가능하면 와일드카드를 끝에 작성하는 것이 좋습니다.

-- 비추천
SELECT * 
FROM TABLE
WHERE COL LIKE '%ABC%'

-- 추천
SELECT * 
FROM TABLE
WHERE COL LIKE 'ABC%'

LIKE 검색시 와일드카드가 시작 부분에 있는 경우 인덱스를 활용하지 않습니다. 따라서 데이터베이스는 모든 레코드를 검색하므로 검색 속도가 느릴 수밖에 없습니다.

 

와일드카드(%)와 실행 계획에 대한 내용은 여기서 자세한 내용을 확인할 수 있습니다.


3. 중복 제거

UNION과 DISTINCT를 같이 사용하지 마십시오. UNION에는 중복 값을 제거하는 기능이 존재하므로 DISTINCT와 함께 사용할 필요가 없습니다.

 

Distinct와 Group By를 함꼐 사용하지 마십시오. Group By절에 입력된 칼럼을 그룹화하므로 DISTINCT와 사용할 필요가 없습니다.


4. ORDER BY 금지

RDBMS마다 다르지만 서브 쿼리(Sub Query)에서 Order By를 사용하는 경우 많은 비용이 발생합니다. 그러므로 서브 쿼리에서 Order By를 사용하지 않도록 합니다.


5. IN 대신 EXISTS 사용

WHERE문에서 서브 쿼리의 값을 확인하려는 경우 IN 또는 EXISTS를 사용할 수 있습니다. IN과 EXISTS는 검색 결과에 따라 어느 것을 사용할지 결정해야 합니다. 서브 쿼리의 결과가 많으면 EXISTS가 나은 성능을 제공하며 그렇지 않으면 IN을 사용하는 것이 좋습니다.

 

EXISTS는 일치하는 항목이 발견되는 즉시 검색 프로세스를 종료하지만 IN은 모든 항목을 비교하기 때문입니다.


6. WHERE문에 함수 사용 제한

SELECT *
FROM TABLE
WHERE CONCAT(COL1, ' ') = 'ABC'

COL1이라는 컬럼이 인덱스로 잡혀있는데 WHERE문에서 함수와 함께 사용되면 인덱스가 깨지므로 검색 속도가 느려집니다. 인덱스로 잡혀있는 칼럼은 WHERE문 또는 JOIN에서 함수와 사용하는 것을 피해야 합니다.


7. 암시적 변환 금지

암시적 변환은 데이터베이스에서 값을 비교할 때, 데이터 타입이 다른 경우 데이터베이스에서 자동으로 타입을 변환 후 값을 비교하는 방식입니다.

 

암시적 변환을 수행하는데 불필요한 리소스가 소모되므로 동일한 타입으로 값을 비교하는 것이 좋습니다.

반응형

댓글