본문 바로가기
DBMS/데이터베이스

[데이터베이스] SQL 튜닝 체크리스트(실전 팁)

by 클레어몬트 2025. 4. 18.

ㅁSQL 튜닝(SQL Tuning): SQL 문장의 성능을 향상시키기 위해 구조나 실행 계획을 최적화하는 작업

 

이는 데이터베이스 시스템에서 불필요한 리소스 소비를 줄이고, 응답 시간을 단축시키며, 전체 시스템의 처리 효율을 높이기 위한 중요한 과정이다

 

 

같은 결과를 반환하는 쿼리라도 작성 방식에 따라 성능 차이가 극명하게 나타날 수 있다. 특히 대량의 데이터를 다루는 시스템에서는 쿼리 하나가 전체 응답 시간을 좌우하기도 한다. 이에 따라, 성능을 높이기 위한 SQL 튜닝(SQL Optimization)은 매우 중요한 작업이다!

 

이번에는 SQL 성능을 개선하기 위해 실무에서 자주 활용되는 튜닝 체크리스트를 알아보려 한다 :)

 

1. SELECT * 대신 필요한 컬럼만 조회

SELECT * 는 모든 컬럼을 가져오기 때문에 불필요한 I/O가 발생할 수 있다. 특히 테이블에 많은 컬럼이 존재하거나, 네트워크로 전송되는 데이터가 클수록 성능에 악영향을 준다.

 

개선 예시

SELECT * FROM orders;

 

SELECT order_id, customer_id, order_date FROM orders;

 

 

필요한 컬럼만 명시적으로 지정하는 것이 원칙이다

 

 

2. 서브쿼리(Subquery) 대신 JOIN 사용

서브쿼리는 상황에 따라 유용하지만, 잘못 사용되면 중첩 루프가 발생하면서 성능이 급격히 저하될 수 있다. 특히 상관 서브쿼리는 매 행마다 실행될 수 있어 주의해야 한다.

 

개선 예시

SELECT name FROM employee  
WHERE dept_id = (SELECT id FROM department WHERE name = 'Sales');

 

SELECT e.name FROM employee
JOIN department d ON e.dept_id = d.id  
WHERE d.name = 'Sales';

 

 

JOIN을 활용하면 옵티마이저가 더 나은 실행 계획을 수립할 수 있다

 

 

3. OR 조건 대신 UNION 활용

OR 조건이 다수 포함된 쿼리는 옵티마이저가 인덱스를 제대로 활용하지 못할 수 있다. 이 경우 조건을 분리하고 UNION으로 결합하면 성능 개선이 가능하다.

SELECT * FROM orders WHERE status = 'SHIPPED' OR status = 'PENDING';

 

SELECT * FROM orders WHERE status = 'SHIPPED'  
UNION  
SELECT * FROM orders WHERE status = 'PENDING';

 

※ 다만, UNION은 중복 제거를 수행하므로 성능이 중요한 경우 UNION ALL을 고려하는 것도 좋다

 

 

4. 인덱스를 활용하여 검색 속도 최적화

대량의 데이터를 대상으로 하는 쿼리는 인덱스가 없으면 Full Table Scan 이 발생할 수 있다. 조건절(WHERE, JOIN, ORDER BY, GROUP BY)에 자주 사용되는 컬럼에는 적절한 인덱스를 생성하여 검색 성능을 향상시켜야 한다!

 

Tip

  • 인덱스가 존재해도 옵티마이저가 사용하지 않을 수 있으므로 EXPLAIN 키워드 등을 통해 실행 계획(Executipn Plan)을 확인하는 것이 중요하다
  • 과도한 인덱스는 오히려 INSERT/UPDATE 성능 저하로 이어질 수 있으므로 주의가 필요하다!

 

 

5. COUNT(*) 대신 COUNT(컬럼) 사용

COUNT(*)는 NULL을 포함한 모든 행을 집계하며, 옵티마이저에 따라 FULL SCAN 이 일어날 수 있다. 반면 COUNT(컬럼)은 해당 컬럼이 NULL이 아닌 경우만 집계하므로, 경우에 따라 더 빠르게 동작할 수 있다.

 

개선 예시

SELECT COUNT(user_id) FROM users;

 

or

SELECT COUNT(*) FROM users WHERE status = 'ACTIVE';

 

상황에 따라 두 방식의 결과가 다를 수 있으므로, 집계 대상 컬럼의 특성과 NULL 허용 여부를 고려하여 선택하는 것이 중요하다.

 

 

 

 

SQL 튜닝은 단순히 성능 개선만을 위한 작업이 아니다. 데이터베이스 리소스를 효율적으로 사용하고, 사용자 경험을 향상시키며, 시스템의 확장성을 높이는 데 핵심적인 역할을 한다. 위의 다섯 가지 체크리스트는 가장 기본적이고 보편적인 규칙이지만, 실제 시스템에서는 옵티마이저의 실행 계획과 통계 정보를 바탕으로 더욱 정교한 분석이 필요하다.

 

"튜닝은 습관이다"


매 쿼리를 작성할 때마다 위와 같은 원칙을 떠올리는 것만으로도, 성능은 분명히 달라질 수 있다!

 

 

 

 

 

#SK, #SKALA, #SKALA1기