서브쿼리 성능 최적화 – 서브쿼리에서 성능을 끌어올리는 5가지 방법
서브쿼리는 SQL에서 매우 유용하게 쓰이는 기능이지만, 잘못 사용하면 전체 쿼리 성능을 크게 떨어뜨릴 수 있습니다. 특히 실무 환경에서는 서브쿼리가 느려지는 원인을 정확히 파악하고, 효율적으로 개선하는 것이 중요합니다. 이 글에서는 서브쿼리를 성능 저하 없이 사용하는 실전 최적화 팁 5가지를 소개합니다.
1. 불필요한 서브쿼리는 조인으로 대체
단순히 조건 확인용으로 쓰이는 서브쿼리는 조인으로 바꾸는 것이 더 나은 경우가 많습니다. 서브쿼리가 테이블을 여러 번 조회할 가능성이 있기 때문에, 조인으로 바꾸면 물리적 접근 횟수를 줄일 수 있습니다.
예시:
SELECT E.ename, D.dname
FROM emp E
JOIN dept D ON E.deptno = D.deptno
WHERE D.loc = 'DALLAS';
이와 같은 방식으로 WHERE
절 서브쿼리를 JOIN
으로 바꾸면 쿼리 최적화에 유리해집니다.
2. 스칼라 서브쿼리는 주의해서 사용
SELECT 절에서 서브쿼리를 쓰는 경우, 특히 테이블 로우마다 반복 실행되기 때문에 성능 저하의 주범이 될 수 있습니다. 이런 경우도 조인으로 바꾸는 게 훨씬 효율적입니다.
비효율적인 예:
SELECT ename,
(SELECT dname FROM dept D WHERE D.deptno = E.deptno) AS dname
FROM emp E;
대체 가능한 방식:
SELECT E.ename, D.dname
FROM emp E
JOIN dept D ON E.deptno = D.deptno;
3. EXISTS vs IN – 상황에 따라 구분
서브쿼리 안에서 IN
을 사용하는 경우와 EXISTS
를 사용하는 경우는 성능 차이가 발생할 수 있습니다. 일반적으로 EXISTS
는 조건을 만족하는 첫 행만 찾으면 종료되므로 더 빠르게 처리됩니다.
-- EXISTS 예시
SELECT ename
FROM emp E
WHERE EXISTS (SELECT 1 FROM dept D WHERE D.deptno = E.deptno AND D.loc = 'DALLAS');
-- IN 예시
SELECT ename
FROM emp
WHERE deptno IN (SELECT deptno FROM dept WHERE loc = 'DALLAS');
두 방식 모두 테스트 후 더 빠른 쪽을 선택하는 것이 좋습니다.
4. 서브쿼리 결과를 뷰 또는 인라인 뷰로 활용
복잡한 서브쿼리를 여러 번 사용할 경우, 해당 서브쿼리를 뷰로 분리하거나 인라인 뷰로 활용하는 것이 성능을 개선하는 데 도움이 됩니다.
SELECT E.ename, V.dname
FROM emp E
JOIN (SELECT deptno, dname FROM dept WHERE loc = 'DALLAS') V
ON E.deptno = V.deptno;
이렇게 하면 서브쿼리 결과를 캐시처럼 활용할 수 있어 반복 실행을 방지할 수 있습니다.
5. 서브쿼리 내부에도 인덱스가 필요하다
서브쿼리가 아무리 작아도, 내부에서 WHERE
, JOIN
, IN
등을 사용하는 경우 해당 조건 컬럼에 인덱스가 없다면 성능 병목이 생깁니다. 서브쿼리라고 해서 옵티마이저가 무시하지 않기 때문에, 내부 테이블의 통계 정보 및 인덱스 구성도 반드시 확인해야 합니다.
서브쿼리는 무조건 나쁘다는 오해가 많지만, 목적과 상황에 맞게 작성하면 충분히 강력한 도구가 됩니다. 위의 팁들을 실제 쿼리에 적용해보고, 옵티마이저 실행 계획을 분석해 보며 성능 개선 효과를 확인해보시기 바랍니다.
#서브쿼리 #SQL성능최적화 #오라클튜닝 #서브쿼리조인 #EXISTSvsIN #인라인뷰
'오라클 실무 쿼리 튜닝' 카테고리의 다른 글
WHERE 조건은 인덱스를 타는데 왜 느릴까? – INDEX RANGE SCAN의 함정과 대처법 (0) | 2025.04.15 |
---|---|
SELECT COUNT(*)가 느릴 때 – 성능 개선 전략과 대안 (0) | 2025.04.15 |
INDEX가 안 잡힐 때 확인할 조건 – 오라클 인덱스 미사용 원인 정리 (0) | 2025.04.15 |
인라인 뷰 vs 테이블 조인 – 같은 결과, 다른 처리 방식 (0) | 2025.04.14 |
INDEX RANGE SCAN과 FULL SCAN, 언제 어떤 게 빠를까? (0) | 2025.04.09 |