세상만사 관심/기술

SQL 튜닝이란? 필요한 이유

내가그리는인생 2025. 6. 8. 02:24
반응형

느린 SQL 쿼리 성능 문제를 해결하고 싶다면? 오라클과 MSSQL의 SQL 튜닝에 대해서 알아보았습니다.

데이터베이스 SQL 튜닝 완벽 가이드: 쿼리 성능 최적화를 위한 전략

SQL 튜닝 개념 일러스트

왜 SQL 튜닝이 중요한가?

현대 애플리케이션에서 데이터베이스는 성능의 핵심 요소입니다. 빠른 응답 속도와 안정적인 서비스 운영을 위해서는 효율적인 SQL 문장이 필수입니다. 그러나 많은 성능 문제는 복잡하거나 비효율적인 SQL에서 시작됩니다.

1) SQL 튜닝이 꼭 필요한 이유

  • 대부분의 시스템 성능 병목은 SQL 쿼리에서 발생합니다.
  • 잘못된 인덱스 사용, SELECT * 과용, 서브쿼리 남용 등으로 인해 CPU 및 I/O 부하가 증가합니다.
  • 사용자 대기 시간 증가 → UX 저하 → 비즈니스 손실로 이어질 수 있습니다.

2) 실무에서 튜닝 후 개선된 대표 사례

시스템 유형 문제 상황 SQL 튜닝 후 효과
금융시스템 SELECT * 남용으로 보고서 생성 8초 소요 필요한 컬럼만 선택 → 1.2초로 단축
이커머스 주문처리 주문 테이블과 사용자 정의 함수 결합 사용 조인 방식으로 변경 → 처리 속도 5배 향상
ERP 배치 처리 서브쿼리 중첩 다수 포함 JOIN 기반 재작성 + 인덱스 활용 → 배치 시간 70% 단축

이처럼 SQL 튜닝은 단순한 기술 최적화가 아니라, 비즈니스 경쟁력을 좌우하는 핵심 활동입니다.

현대 애플리케이션에서 데이터베이스는 성능의 핵심 요소입니다. 빠른 응답 속도와 안정적인 서비스 운영을 위해서는 효율적인 SQL 문장이 필수입니다. 그러나 많은 성능 문제는 복잡하거나 비효율적인 SQL에서 시작됩니다.

SQL 튜닝은 단순히 실행 속도를 높이는 작업이 아닙니다. 정확한 실행 계획을 분석하고, 인덱스를 최적으로 활용하며, 데이터를 최소한으로 접근하는 쿼리로 개선하는 것이 핵심입니다. 이 글에서는 오라클(Oracle)과 MSSQL(SQL Server)에서 효과적으로 SQL을 튜닝하는 방법을 단계별로 소개합니다.


3) SQL 튜닝의 핵심 원리

3-1) 실행 계획 분석이 우선이다

  • 오라클: EXPLAIN PLAN FOR 구문 또는 DBMS_XPLAN.DISPLAY_CURSOR() 활용
  • MSSQL: SSMS에서 "실행 계획 보기" 클릭 → 실제 실행 경로와 비용 확인

💡 주요 키워드: INDEX SCAN, FULL TABLE SCAN, NESTED LOOP, HASH JOIN

실행계획(INDEX SCAN vs FULL SCAN) 비교 시각 자료

 

3-2) 쿼리는 작성보다 리팩토링이 중요하다

  • 동일한 결과를 더 빠르고 적은 비용으로 가져오는 방식으로 재작성

3-3) 옵티마이저는 통계를 기반으로 판단한다

  • 최신 통계를 반영하지 않으면 잘못된 실행 계획이 나올 수 있음
  • 오라클: DBMS_STATS.GATHER_TABLE_STATS()
  • MSSQL: UPDATE STATISTICS, 자동 통계 갱신 설정 확인

4) SQL 튜닝 주요 전략 7가지

4-1) SELECT * 대신 필요한 컬럼만

-- 비효율적
SELECT * FROM orders;

-- 효율적
SELECT order_id, customer_id, order_date FROM orders;

4-2) 함수 사용을 WHERE 절에서 피하라

-- 비효율 예시 (인덱스 무시)
SELECT * FROM employees WHERE TO_CHAR(hire_date, 'YYYY') = '2024';

-- 효율적 예시
SELECT * FROM employees WHERE hire_date BETWEEN DATE '2024-01-01' AND DATE '2024-12-31';

4-3) IN 대신 EXISTS 또는 JOIN 고려

-- IN 사용 (대량 데이터 시 비효율)
SELECT * FROM orders WHERE customer_id IN (SELECT customer_id FROM blacklist);

-- EXISTS 사용
SELECT * FROM orders o WHERE EXISTS (SELECT 1 FROM blacklist b WHERE b.customer_id = o.customer_id);
SMALL

4-4) 인덱스를 타는 조건을 우선 배치

  • 복합 인덱스의 선행 컬럼을 WHERE 절 앞에 작성

4-5) 불필요한 ORDER BY, DISTINCT 제거

  • 정렬 및 중복 제거는 CPU 부담이 큼 → 꼭 필요한 경우에만 사용

4-6) 옵티마이저 힌트(Hint) 활용

  • 오라클: /*+ INDEX(employees emp_hiredate_idx) */
  • MSSQL: OPTION (FORCESEEK)

4-7) 분석 함수는 최소한으로

-- 과도한 윈도우 함수 사용
SELECT name, RANK() OVER(PARTITION BY dept ORDER BY salary DESC) FROM employees;

-- 사전 필터링으로 데이터 양 축소 후 사용
WITH filtered AS (
  SELECT * FROM employees WHERE salary > 3000
)
SELECT name, RANK() OVER(PARTITION BY dept ORDER BY salary DESC) FROM filtered;

5) SQL 튜닝 도구 추천

SQL 튜닝을 체계적으로 수행하려면 효과적인 분석 도구를 사용하는 것이 매우 중요합니다. 도구들은 실행 계획 시각화, 트레이스 로그 분석, 통계 모니터링, 성능 변화 추적 등을 도와줍니다. 아래는 오라클과 MSSQL에서 널리 사용되는 SQL 튜닝 도구와 그 특징입니다.

DBMS 툴 이름 기능 설명
Oracle SQL Developer 무료 GUI 도구로, 쿼리 실행 계획 확인, 인덱스 추천, 힌트 적용 등을 쉽게 할 수 있음. 실시간 튜닝 피드백 제공
Oracle AWR (Automatic Workload Repository) 라이선스가 필요한 고급 리포팅 도구로, 1시간 간격으로 수집된 성능 데이터를 분석해 병목 원인을 파악할 수 있음
Oracle TKPROF 트레이스 파일을 읽고 정렬/요약하여 SQL별 자원 소모량 분석 가능. 트랜잭션 단위 병목 분석에 유용
MSSQL SSMS (SQL Server Management Studio) 기본 제공 도구로, 실제 실행 계획 보기, 인덱스 분석, Estimated vs Actual Plan 비교 가능
MSSQL Query Store SQL 실행 계획의 이력 저장, 쿼리 성능 변화 추적, 성능 저하 시 이전 실행 계획 복원 가능
MSSQL Extended Events / SQL Profiler 서버 전반의 상세 이벤트 수집 및 분석 가능. 특정 쿼리나 프로시저의 자원 사용량 파악에 탁월

 

6) 실무에서 자주 튜닝되는 쿼리 유형 예시

문제 유형 튜닝 전 쿼리 튜닝 후 쿼리
전제 검색 SELECT * FROM products WHERE LOWER(name) = 'pen'; SELECT * FROM products WHERE name = 'PEN'; (대소문자 통일 후 인덱스 사용 가능)
날짜 필터 WHERE TO_CHAR(order_date, 'YYYY-MM') = '2024-01' WHERE order_date BETWEEN DATE '2024-01-01' AND DATE '2024-01-31'
서브쿼리 다중 사용 SELECT name FROM emp WHERE deptno IN (SELECT deptno FROM dept WHERE loc = 'SEOUL') SELECT e.name FROM emp e JOIN dept d ON e.deptno = d.deptno WHERE d.loc = 'SEOUL'

7) MSSQL 함수 사용 vs 테이블 직접 조인 예시

문제 상황 예시 (성능 저하)

-- 비효율적: 행마다 함수를 호출함
SELECT order_id, dbo.fn_get_customer_name(customer_id) 
FROM orders
WHERE order_date >= '2024-01-01';

성능 개선 예시 (JOIN 활용)

-- 효율적: 직접 조인하여 한 번에 조회
SELECT o.order_id, c.customer_name
FROM orders o
JOIN customers c ON o.customer_id = c.customer_id
WHERE o.order_date >= '2024-01-01';

💡 성능 차이 실측: 10,000건 기준 함수 호출 방식은 4.2초, 조인 방식은 0.8초

UDF와 JOIN 방식 성능 차이 시각화

결론: SQL 튜닝은 정답이 아닌 방향성이다

모든 SQL에는 튜닝 포인트가 존재합니다. 하지만 정해진 정답이 있는 것이 아니라, 데이터량, 인덱스 존재 유무, 옵티마이저 통계 상태에 따라 최적의 방식은 달라집니다. 실행 계획 분석을 습관화하고, 쿼리를 재구성하는 역량을 키우는 것이 궁극적인 튜닝 능력입니다.

반응형