"튜닝 쿼리 변형"의 두 판 사이의 차이
DB CAFE
(→서브쿼리 Unnesting) |
(→UNNEST 힌트) |
||
23번째 줄: | 23번째 줄: | ||
==== UNNEST 힌트 ==== | ==== UNNEST 힌트 ==== | ||
+ | <source lang=sql> | ||
+ | /*+ UNNEST */ | ||
+ | </source> | ||
* 서브쿼리를 Unnesting 함을써 조인방식으로 최적화하도록 유도. | * 서브쿼리를 Unnesting 함을써 조인방식으로 최적화하도록 유도. | ||
* 즉,서브쿼리를 메인쿼리절의 FROM절로 올리도록 쿼리를 변형한다. | * 즉,서브쿼리를 메인쿼리절의 FROM절로 올리도록 쿼리를 변형한다. |
2023년 6월 12일 (월) 22:10 판
thumb_up 추천메뉴 바로가기
- DBA { Oracle DBA 명령어 > DBA 초급 과정 > DBA 고급 과정 }
- 튜닝 { 오라클 튜닝 목록 }
- 모델링 { 데이터 모델링 가이드 }
목차
1 쿼리 변환 종류[편집]
- 10g부터는 서브쿼리 Unnesting과 뷰 Merging이 비용기반 쿼리 변환으로 전환됨
- 조건절 Pushing 중 조인 조건 pushdown도 비용기반 쿼리 변화으로 전환
- 나머지는 변환된 쿼리가 항상 더 나은 성능을 제공하므로 비용기반으로 전환이 불필요
1.1 서브쿼리 Unnesting[편집]
- UNNEST_SUBQUERY 세션 매개변수를 TRUE로 설정하면 하위 쿼리 중첩 해제가 활성화됩니다.
- 서브 쿼리의 중첩을 해제하여 메인쿼리에 병합토록 지시하여 옵티마이저가 액세스 경로 및 조인을 평가할 때 이들을 함께 고려할 수 있도록 합니다.
1.1.1 UNNEST 힌트[편집]
/*+ UNNEST */
- 서브쿼리를 Unnesting 함을써 조인방식으로 최적화하도록 유도.
- 즉,서브쿼리를 메인쿼리절의 FROM절로 올리도록 쿼리를 변형한다.
1.1.2 NO_UNNEST 힌트[편집]
- 서브쿼리를 그대로 둔 상태에서 필터 방식으로 최적화 하도록 유도.
1.1.3 옵티마이저가 중첩해제를 못하는 경우[편집]
- ROWNUM 가상컬럼
- 집합 연산자 중 하나
- 중첩집계함수,서브쿼리의 외부(바깥) 쿼리 블록이 아닌 쿼리블록에 상호연관함수가 포함 된 계층적 서브쿼리(connect by ) 및 서브쿼리가 포함됩니다.
1.1.4 옵티마이저가 자동 중첩해제(UNNEST) 하는 경우[편집]
- 연관관계가 없는 IN 절의 하위 쿼리
- IN 과 EXISTS 의 연관된 서브쿼리, 집계 함수 또는 GROUP BY 절을 포함하지 않는 경우
- 옵티마이저에 추가서브쿼리 유형의 중첩을 해제하도록 지시하여 확장 서브쿼리 중첩해제를 활성화 할 수 있습니다.
- 서브쿼리에 HASH_AJ 또는 MERGE_AJ 힌트를 지정하여 상관되지 않은 NOT IN 서브쿼리의 중첩을 해제 할 수 있음.
- 서브쿼리에 UNNEST 힌트를 지정하여 다른 서브쿼리를 중첩 해제 할 수 있습니다.
- 반대로 NO_UNNEST 힌트는 기존 서브쿼리 형태를 유지 하고 필터방식으로 실행계획이 수립되도록 하는 힌트임.
- WHERE절에 사용되는 서브쿼리를 중첩 서브쿼리(Nested Subquery)라고 하며 IN, EXISTS 관계없이 메인쿼리에서 읽히는 FILTER방식으로 처리되어 메인레코드 하나 읽을 때마다 서브쿼리를 반복적으로 수행하면서 조건에 맞는 데이터를 추출하는 것이다.
- 이러한 필터방식이 최적의 성능을 보장하지 않으므로 옵티마이저는 조인문으로 변경후 최적화(Unnesting) 하거나 메인과 서브쿼리를 별도의 SUB PLAN으로 분리하여 각각 최적화를 수행하는데 이때 서브쿼리에 FILTER 연산이 나타난다.
- 서브 쿼리를 Unnesting 하지 않는다면 메인쿼리의 건 마다 서브쿼리를 반복 수행하는 FILTER 연산자를 사용하기에 Unnesting 힌트는 효율적으로 사용한다면 성능 향상을 가져온다.
1.1.5 UNNEST 같이 쓰는 힌트[편집]
- SWAP_JOIN_INPUTS : 해쉬테이블로 올릴 테이블 지정
- NO_SWAP_JOIN_INPUTS : 해쉬테이블로 올리지 않을 테이블 지정
- NL_SJ : NL SEMI JOIN 으로 수행 되도록 지시
- HASH_SJ SWAP_JOIN_INPUTS : HASH SEMI JOIN 으로 수행 되도록 지시 하고 서브쿼리를 먼저수행(해시테이블로) 되도록 지시함.
- HASH_SJ NO_SWAP_JOIN_INPUTS : HASH SEMI JOIN 으로 수행 되도록 지시 하고 서브쿼리를 먼저수행(해시테이블로) 되지 않도록 지시함.
- NL_AJ : NOT EXISTS 쿼리를 NL JOIN ANTI 로 수행 되도록 함.
- HASH_AJ : NOT EXISTS 쿼리를 HASH JOIN ANTI 로 수행 되도록 함.