Oracle 데이터베이스는 SQL 성능 최적화를 위해 다양한 옵티마이저 기법을 사용합니다. 그중 하나가 뷰 머지(View Merging)입니다. 하지만 특정 시나리오에서는 옵티마이저가 뷰 또는 인라인 뷰를 메인 쿼리와 병합(Merge)하는 것이 오히려 성능 저하를 초래할 수 있습니다. 이럴 때 NO_MERGE 힌트를 활용하면 개발자가 원하는 실행 계획을 유도할 수 있습니다.
NO_MERGE 힌트란?
NO_MERGE
힌트는 옵티마이저가 서브쿼리 또는 뷰를 메인 쿼리와 병합하지 않고, 별도의 뷰로 독립적으로 실행하도록 지시하는 힌트입니다. 기본적으로 옵티마이저는 쿼리의 성능을 높이기 위해 뷰를 자동 병합하지만, 때로는 이를 억제하는 것이 더 좋은 결과를 가져옵니다.
NO_MERGE 힌트의 필요성
옵티마이저가 뷰를 병합하면 불필요한 조인 순서 변경, 예상치 못한 풀 테이블 스캔 등이 발생할 수 있습니다. NO_MERGE 힌트를 사용하면 이러한 부작용을 방지하고, 뷰 설계 의도와 일치하는 실행 계획을 보장할 수 있습니다.
NO_MERGE 힌트 사용 예제
SELECT /*+ NO_MERGE(v) */ v.department_id, e.employee_id, e.salary
FROM (SELECT department_id FROM departments WHERE location_id = 1700) v,
employees e
WHERE v.department_id = e.department_id;
위 예제는 서브쿼리 v를 메인 쿼리와 병합하지 않도록 지시합니다. 이렇게 하면 v가 먼저 실행되어 결과 집합이 생성된 후, employees 테이블과 조인됩니다.
NO_MERGE와 다른 힌트 비교
힌트 | 기능 | 장점 | 단점 | 추천 시나리오 |
---|---|---|---|---|
NO_MERGE | 뷰 병합 방지 | 예측 가능한 실행 계획 | 병합 이점 포기 | 뷰 독립 실행 |
MERGE | 뷰 병합 강제 | 병합 최적화 가능 | 예상치 못한 계획 | 단순 쿼리 최적화 |
USE_HASH | Hash Join 강제 | 대용량 조인 강점 | 메모리 부담 | DW, 분석용 |
LEADING | 조인 순서 지정 | 정밀 제어 가능 | 복잡성 증가 | 복합 조인 튜닝 |
NO_MERGE 힌트 활용 시나리오
NO_MERGE 힌트는 다음과 같은 환경에서 특히 효과적입니다:
- 복잡한 서브쿼리를 메인 쿼리와 분리해서 독립 실행하고 싶을 때
- 뷰 병합으로 인해 불필요한 조인 순서 변경이나 성능 저하가 발생할 때
- 데이터 필터링과 집계를 뷰 단위로 먼저 수행하고자 할 때
NO_MERGE 힌트 사용 시 유의사항
- 뷰 병합을 억제하면 일부 상황에서 병합 최적화 효과를 잃을 수 있습니다.
- 실행 계획을
EXPLAIN PLAN
이나DBMS_XPLAN
을 통해 반드시 검증하세요. - 병합이 필요할 때는 반대로 MERGE 힌트를 사용하는 것이 더 적합합니다.
NO_MERGE 힌트 요약 및 비교
힌트 | 주요 기능 | 장점 | 단점 | 추천 환경 |
---|---|---|---|---|
NO_MERGE | 뷰 병합 억제 | 예측 가능한 계획 | 병합 최적화 미활용 | 복잡 뷰, 독립 실행 |
MERGE | 병합 강제 | 최적화 가능성 높음 | 예상치 못한 조인 | 단순 쿼리 |
USE_HASH | Hash Join | 대규모 집합 유리 | 메모리 부담 | DW 분석 |
LEADING | 조인 순서 | 세밀한 제어 | 복잡성 | 복합 조인 |
NO_MERGE 힌트 실전 활용 팁
- 복잡한 뷰를 포함한 쿼리는 NO_MERGE 힌트를 사용해 계획을 분리하고 병합에 따른 리스크를 줄여라.
- 테스트 환경에서 실행 계획과 비용을 반드시 확인한 뒤 운영 환경에 적용하라.
- 복수 힌트를 사용하는 경우, 실행 순서와 상호 작용을 면밀히 검토하라.
- 서브쿼리 최적화가 중요한 데이터 집약적 쿼리에 활용하라.
결론
Oracle의 NO_MERGE 힌트는 복잡한 뷰와 서브쿼리를 독립적으로 실행하도록 유도하여 예측 가능한 실행 계획을 제공합니다. 이는 불필요한 병합 최적화를 방지하고, 뷰 단위 로직의 명확성을 유지하는 데 핵심적인 도구입니다. 전략적으로 NO_MERGE를 활용하면, 쿼리 안정성과 성능을 동시에 확보할 수 있습니다.
출처
- Oracle® Database SQL Tuning Guide 21c, Oracle Corporation
- Expert Oracle SQL, Tony Hasler, Apress
- 실무 경험 및 성능 분석 자료 (2025년 7월 기준)
'Oracle > Hint' 카테고리의 다른 글
[ORACLE] NO_UNNEST 힌트 완벽 분석과 실전 활용 전략 (0) | 2025.07.08 |
---|---|
[ORACLE] UNNEST 힌트 완벽 분석과 실전 활용 전략 (0) | 2025.07.08 |
[ORACLE] MERGE 힌트 완벽 분석과 실전 활용 전략 (0) | 2025.07.07 |
[ORACLE] NO_PARALLEL 힌트 완벽 분석과 실전 활용 전략 (0) | 2025.07.07 |
[ORACLE] PARALLEL 힌트 완벽 분석과 실전 활용 전략 (0) | 2025.07.07 |