오라클 힌트에 대해서 정리해보려고 합니다.
힌트라고 하는 것은 옵티마이져에게 사용자의 요구를 전달할 수 있는 중요한 보조 수단 입니다.
1.Optimizer 모드 제어 힌트
가) ALL_ROWS
- 전체 결과의 최적화를 목표로 최저 비용의 실행계획을 수립하는 힌트 입니다.
나) CHOOSE
- 통계정보 유무에 따라 규칙기준 혹은 비용기준을 적용하여 최적화를 수행 합니다.
(테이블 통계정보를 참조할 수 있는 경우 ALL_ROWS방식으로 처리됩니다.)
다) FIRST_ROWS
- 최적 응답시간을 목표로 최저 비용의 실행계획을 수힙합니다.
라) RULE
- 인덱스, 연산자 형태 등의 우선순위에 근거하는 규칙기준 옵티마이져를 이용한 최적화 입니다.
2. 조인순서 조정을 위한 힌트
가) ORDERED
- FROM 절에 기술된 테이블 순서대로 조인을 수행하도록 유도 하는 힌트 입니다.
- LEADING 힌트와 함께 사용되면 LEADING 힌트는 무시됩니다.
- 조인방법과는 무관하며, 조인방법 유도 힌트와 함께 사용하는 것이 일반적입니다.
나) LEADING
- FROM 절에 기술된순서와 상관없이 조인 순서를 제어 하는 힌트 입니다.
- ORDERED 절 힌트와 달리 FROM 절을 변경하지 않아도 됩니다.
- ORDERED 힌트와 함께 사용되면 무시됩니다.
3. 조인방법 선택을 위한 힌트
가) USE_NL
- Nested loops 방식을 사용 조인을 수행하는 힌트 입니다.
- 대상 집합 간의 조인 방식을 지정합니다. 조인 순서와는 무관합니다.
나) NO_USE_NL
- 지정 테이블에 대해 Nested loops방식을 제외한 다른 방식의 조인 수행 하도록 유도하는 힌트 입니다.
- 옵티마이져가 Nested loops 방식이 최적이라 판단할 경우 힌트가 무시 됩니다.
다) USE_NL_WITH_INDEX
- USER_NL과 INDEX 힌트의 통합 형태 입니다.
라) USE_HASH
- 해쉬 방식으로 조인 수행하는 힌트입니다.
- 옵티마이져가 통계정보를 토대로 빌드/검색 입력 결정을 합니다.
- 빌드/검색 입력에 대한 옵티마이져 판단 문제시 ORDERED 힌트 병행사용 됩니다.
마) NO_USE_HASH
- 지정 테이블에 대해 HASH JOIN 방식을 제외한 다른 방식의 조인을 수행하도록 유도하는 힌트 입니다.
바) USE_MERGE
- SORT MERGE 방식으로 조인을 수행합니다.
- 필요에 의해 ORDERED 힌트와 병행사용을 권장합니다.
사) NO_USE_MERGE
- 지정 테이블에 대해 SORT MERGE방식을 제외한 다른 방식의 조인을 수행하도록 유도하는 힌트 입니다.
3. 병렬처리 관련 힌트
가) PARALLEL_INDEX
- 파티션 인덱스(PARTITIONED INDEX)에 대해 인덱스 범위 스캔 병렬 처리하는 힌트 입니다.
나) NOPARALLEL_INDEX
- PARALLEL 파라메터가 인덱스에 지정된 경우, 병렬 인덱스 스킵 스캔을 하지 않습니다.
- 버전에 따라 NO_PARALLEL_INDEX 힌트로 대체 가능 합니다.
다) PQ_DISTRIBUTE
- 병렬 조인 수행 속도 향상을 위해 사용합니다.
- 슬레이브 프로세스 사이에서 조인할 테이블의 로우를 주고 받는 할당작업 방법 정의 합니다.
4. 액세스 수단 선택을 위한 힌트
가) FULL
- 전체 테이블 스캔 방식 수행
나) HASH
- 해쉬 클러스터 테이블 액세스시 해쉬 스캔방식 수행하는 힌트 입니다.
다) CLUSTER
- 클러스터링 테이블 액세스시 클러스터 인덱스 스캔 수행하는 힌트 입니다.
라) INDEX
- 인덱스 범위 스캔을 수행하는 힌트 입니다.
- 뷰 액세스 쿼리의 경우 뷰 쿼리 내 테이블에 대한 인덱스 스캔 지정도 가능합니다.
마) NO_INDEX
- 지정한 인덱스를 제외하고 다른 액세스 방법으로 수행을 유도하는 힌트 입니다.
- 테이블만 정의시 해당 테이블의 모든 인덱스를 제외합니다.
바) INDEX_ASC
- 지정한 인덱스 컬럼에 대해 컬럼값의 오름차순으로 범위 스캔 수행하는 인덱스 입니다.
사) INDEX_DESC
- 지정한 인ㄷ게스 컬럼에 대해 컬럼값이 내림차순으로 범위 스캔 수행하는 인덱스 입니다.
아) INDEX_COMBINE
- 2개 이상의 인덱스를 비트맵 인덱스로 변경/결합하여 액세스 수행 하는 인덱스 입니다.
- 테이블명만 지정 시 옵티마이져가 해당 테이블의 적합한 인덱스를 선정하여 처리 합니다.
자) INDEX_FFS
- 인덱스 전체범위 스캔 수행 하는 인덱스 입니다. (다중 블록 스캔을 사용합니다.)
카) NO_INDEX_FFS
- 지정한 테이블의 인덱스에 대해 고속 전체 인덱스 스캔을 제외한 방식으로 수행 하는 인덱스 입니다.
타) INDEX_JOIN
- 2개 이상의 인덱스들만으로 조인을 수행하는 인덱스 입니다.
- 인덱스 구성 컬럼이 해당질의에서 필요하는 모든 컬럼을 포함 해야 합니다.
- 인덱스 범위 스캔 결과를 ROWID로 해쉬조인을 수행하여 결과 생성 합니다.
5. 기타힌트
가) APPEND
- INSERT시 DIRECT-PATH방식으로 수행 합니다. (병렬모드 수행)
나) CACHE
- 전체테이블 스캔 방식으로 읽힌 블록을 LRU리스트 최근 사용 위치에 머물도록 하는 힌트 입니다.
- 크기가 작은 테이블에 유용합니다. 기본 캐쉬 정의는 무효화 됩니다.
다) CARDINALITY
- 해당 쿼리 전체/일부 구성에 대한 카디널리티 예상값을 제공 실행계획 수립에 참조하는 힌트 입니다.
- 테이블을 지정하지 않을 경우 카디널리티는 전체 쿼리를 수행한 결과 총 건수로 간주 합니다.
라) PUSH_PRED
- 뷰나 인라인뷰의 외부에 있는 조인 조건을 뷰 쿼리 내로 삽입하는 힌트 입니다.
- 직접 조인을 한 것과 같은 실행계획을 생성 합니다.
마) PUSH_SUBQ
- MERGE되지 않은 서브쿼리를 최대한 먼저 수행되도록 실행계획을 수힙하는 힌트 입니다.
- 수행된 서브쿼리는 제공자의 역할을 합니다.
정리한 인덱스 외에도 많은 힌트들이 있습니다.
힌트를 사용하는 이유는 옵티마이져의 잘못된 판단을 바로 잡아주는 방법입니다.
잘못 사용할 경우 쿼리가 지정될수 있습니다.
'관심1 > 오라클' 카테고리의 다른 글
오라클 함수(숫자,날짜) 알아보기 (0) | 2016.12.29 |
---|---|
오라클 함수(형변환,문자) 알아보기 (0) | 2016.12.29 |
최적의 SQL 작성 (0) | 2016.12.10 |
오라클 DCL(Data Control Language) 알아보기 (0) | 2016.11.08 |
오라클 DDL(Data Definition Language) 알아보기 (1) | 2016.11.04 |