[sql] 서브쿼리 최소화
서브쿼리는 데이터베이스에서 매우 강력한 기능이지만, 잘못 사용하면 성능에 부정적인 영향을 줄 수 있습니다. 이번 글에서는 서브쿼리를 최소화하여 성능을 최적화하는 방법에 대해 알아보겠습니다.
서브쿼리란?
서브쿼리는 다른 쿼리 안에 중첩된 쿼리로, 외부 쿼리의 결과에 따라 내부 쿼리의 실행이 동적으로 결정됩니다. 주로 SELECT, INSERT, UPDATE, DELETE 문 등에서 사용되며, 주로 비교 연산자와 함께 사용됩니다.
예를 들어, 다음과 같이 서브쿼리를 사용할 수 있습니다.
SELECT * FROM employees WHERE department_id = (SELECT id FROM departments WHERE name = 'Sales');
서브쿼리 최소화하기
서브쿼리는 편리하지만, 성능에 부정적인 영향을 미칠 수 있습니다. 이를 피하기 위해 다음과 같은 방법을 고려할 수 있습니다.
JOIN 사용
대부분의 경우, 서브쿼리를 JOIN으로 대체할 수 있습니다. 예를 들어 위의 예제는 다음과 같이 JOIN으로 변경할 수 있습니다.
SELECT e.*
FROM employees e
INNER JOIN departments d
ON e.department_id = d.id
WHERE d.name = 'Sales';
EXISTS, NOT EXISTS 사용
서브쿼리를 사용하여 존재 여부를 확인하는 경우, EXISTS나 NOT EXISTS를 사용하여 JOIN을 피할 수 있습니다.
SELECT * FROM employees e
WHERE EXISTS (SELECT 1 FROM departments d WHERE e.department_id = d.id AND d.name = 'Sales');
파생 테이블
서브쿼리 대신 파생 테이블(Derived Table)을 사용하여 중첩 쿼리를 최소화할 수 있습니다.
SELECT * FROM
(SELECT id FROM departments WHERE name = 'Sales') d
JOIN employees e ON e.department_id = d.id;
요약
서브쿼리의 사용은 편리하지만, 성능에 영향을 줄 수 있기 때문에 최대한 최소화하는 것이 중요합니다. JOIN, EXISTS, NOT EXISTS 및 파생 테이블 등을 활용하여 서브쿼리를 최적화하는 것이 좋습니다.
참고 자료:
- “Use The SQLPlus /+ RULE */ Hint For Either All SQL Statements Accessing A Table Or For An Entire Session.”
- “9.2. Subqueries with EXISTS or NOT EXISTS”
- “Using Subqueries in the Select Statement”
Happy coding!