SQL 튜닝(SQL Tuning)은 느린 SQL을 빠르게 만드는 작업입니다. 실제 업무에서는 데이터의 양이 수백만 건이 넘기 때문에, 잘못 작성된 SQL은 시스템 전체 성능에 영향을 줍니다. 이번 포스트에서는 실무에서 자주 사용되는 SQL 튜닝 기법을 정리해보겠습니다.
✅ 1. SQL 튜닝이 중요한 이유
SQL 튜닝은 단순히 쿼리를 빠르게 만드는 작업을 넘어, 전체 시스템의 성능을 최적화하고 병목현상을 해결하는 데 중요합니다.
- 비효율적인 SQL → 시스템 부하 증가
- 사용자 응답 지연 → 업무 생산성 저하
- DB 락 발생 → 동시성 문제 유발
✅ 2. 실무에서 자주 쓰는 SQL 튜닝 기법
1) SELECT 사용 지양
필요한 컬럼만 명시하세요.
-- 비효율적
SELECT FROM employees;
-- 개선
SELECT emp_id, emp_name FROM employees;
- 불필요한 I/O 증가
- 실행 계획의 재사용이 어려움
2) 인덱스 활용
WHERE 절, JOIN 조건에 인덱스 컬럼을 사용하면 효율적입니다.
-- 인덱스가 존재하는 emp_id 컬럼 활용
SELECT FROM employees WHERE emp_id = 101;
인덱스가 있어도 함수 사용, 형 변환 시 무효화될 수 있음
-- 비효율적
SELECT FROM employees WHERE TO_CHAR(emp_id) = '101';
3) WHERE 조건 순서보단 인덱스 활용 여부가 중요
RDBMS는 WHERE 조건 순서를 따르지 않고 통계 정보 기반으로 최적 계획을 선택함
4) 서브쿼리보다 JOIN을 우선 고려
-- 비효율적
SELECT name FROM students
WHERE dept_id IN (SELECT id FROM departments WHERE name = '컴퓨터공학');
-- 개선
SELECT s.name FROM students s
JOIN departments d ON s.dept_id = d.id
WHERE d.name = '컴퓨터공학';
서브쿼리는 비효율적인 Nested Loop Join 유발 가능
5) GROUP BY, ORDER BY는 꼭 필요한 경우만 사용
많은 리소스를 사용하므로, 필요한 경우에만!
-- 꼭 필요한 경우가 아니라면 ORDER BY는 제거
SELECT name FROM students ORDER BY name;
6) UNION 대신 UNION ALL 사용 고려
- UNION은 중복 제거 작업이 추가로 필요 → 성능 저하
- 중복 데이터가 없거나 상관없다면 UNION ALL 사용
-- 성능 저하
SELECT name FROM teachers
UNION
SELECT name FROM students;
-- 개선
SELECT name FROM teachers
UNION ALL
SELECT name FROM students;
7) EXISTS vs IN
대량의 서브쿼리 결과가 있을 경우 EXISTS가 더 효율적
-- 비효율적
SELECT name FROM students
WHERE dept_id IN (SELECT id FROM departments WHERE grade = 'A');
-- 개선
SELECT name FROM students s
WHERE EXISTS (
SELECT 1 FROM departments d
WHERE d.grade = 'A' AND d.id = s.dept_id
);
8) 불필요한 DISTINCT 지양
DISTINCT는 결과 집합을 정렬하고 중복 제거 → 리소스 낭비
-- 개선 전
SELECT DISTINCT name FROM employees;
-- 개선 후 (중복이 발생하지 않는 컬럼이라면 제거)
SELECT name FROM employees;
✅ 3. SQL 실행계획(EXPLAIN PLAN) 분석
SQL 성능 문제를 확인하려면 실행계획을 확인해야 합니다.
- Full Table Scan: 인덱스 없이 테이블 전체 검색
- Index Scan: 인덱스를 활용한 검색
- Nested Loop Join: 반복적으로 루프 수행 → 느림
- Hash Join / Merge Join: 대용량 처리에 유리
📌 EXPLAIN PLAN 사용 예:
EXPLAIN PLAN FOR
SELECT FROM employees WHERE emp_id = 101;
✅ 4. 통계정보 갱신 & 바인딩 변수 사용
- 통계정보가 최신이어야 옵티마이저가 정확한 실행계획을 세울 수 있음
- 바인딩 변수를 통해 실행계획 캐싱 가능
-- 바인딩 변수 사용 예
SELECT FROM employees WHERE emp_id = :emp_id;
✅ 5. 튜닝 전과 후 성능 비교 기준
항목 | 튜닝 전 | 튜닝 후 |
응답 속도 | 느림 | 빠름 |
CPU 사용량 | 높음 | 낮음 |
디스크 I/O | 많음 | 최소화 |
실행 계획 | Full Scan 등 | Index Scan 등 |
✅ 마무리 정리
- SQL 튜닝은 성능 향상과 자원 절약의 핵심
- 튜닝 시에는 실행계획 확인 → 인덱스 활용 → 불필요 연산 제거 순으로 접근
- 실제 데이터 환경을 고려한 테스트가 중요
'프로그래밍' 카테고리의 다른 글
SQL 튜닝 심화: 실행 계획(Execution Plan) 완전 정복 (1) | 2025.08.08 |
---|---|
SQL 튜닝 개요 및 전략|실무에서 바로 쓰는 성능 향상 기법 (3) | 2025.08.07 |
트랜잭션과 병행 제어: 데이터베이스의 신뢰성을 지키는 핵심 원리 (3) | 2025.08.06 |
인덱스와 성능 향상 전략 – SQLD 필수 개념 정리 (2) | 2025.08.05 |
서브쿼리와 인라인 뷰 – SQLD 필수 개념 정리 (2) | 2025.08.05 |