Other Hints - APPEND_HINT /*+ APPEND */ - 직렬 모드 데이터베이스에서 Direct INSERT를 실행하게 한다. - Enterprise Edition이 아닌 데이터베이스의 기본 모드는 직렬 모드이다. 이러한 직렬 모드 데이터베이스에서의 INSERT작업은 Conventional를 기본값으로 하고 병렬 처리 시에는 Direct INSERT를 기본값으로 한다. - NOAPPEND /*+ NOAPPEND */ - 병렬 모드에서의 INSERT작업을 Conventional 방식으로 수행한다. - 병렬 모드에서는 Direct-path INSER가, 직렬 모드에서는 Conventional INSERT가 기본값이다. - CACHE_HINT /*+ CACHE (table) */ - 풀 테이..
Query Transformation Hints - EXPAND_GSET_TO_UNION /*+ EXPAND_GSET_TO_UNION */ - GROUP BY GROUPING SET 혹은 GROUP BY ROLLUP 등과 같은 구문을 포함하는 쿼리에 사용할 수 있다. - 이 힌트는 기존의 쿼리를 개별적인 그룹 생성 후, UNION ALL 방식으로 실행되게 유도한다. - FACT_HINT /*+ FACT (tabl) */ - Star 변형 구문에서 사용되며 해당 테이블이 FACT 테이블로 사용되게 유도한다. - NO_FACT /*+ NO_FACT (table) */ - Star 변형 시, 해당 테이블의 FACT 테이블로서의 사용을 방지한다. - MERGE /*+ MERGE (table) */ - 각 쿼리의..
Parallel Execution Hints - PARALLEL /*+ PARALLEL (table [ [ , n |, DEFAULT |,] [ , n | DEFAULT |] ] ) */ - 병렬 처리에 사용될 서버 프로세스의 개수를 설정한다. - 병렬 처리 조건에 위배될 시, 힌트는 사용되지 않는다. - 임시 테이블에 대한 PARALLEL_HINT 사용 시, 힌트는 사용되지 않는다. - NOPARALLEL /*+ NOPARALLEL (table) */ - 지정한 테이블의 병렬 처리를 방지한다. - 테이블의 지정된 PARALLEL 값에 대해서 우선권을 가진다. - 중첩 테이블에 대해서는 병렬 처리를 할 수 없다. - PARALLEL_INDEX /*+ PARALLEL_INDEX (table [ [index..
Join Operation Hints - DRIVING_SITE /*+ DRIVING_SITE (table) */ - 오라클이 선택한 SITE 대신, 지정한 SITE를 사용하여 쿼리를 실행한다. Rule-Based와 Cost-Based, 두 모드다 사용 가능하다. - HASH_SJ, MERGE_SJ, NL_SJ /*+ HASH_AJ */ - EXISTS 구문 뒤에 오는 서브 쿼리에 사용되며 HASH_SJ, MERGE_SJ 혹은 NL_SJ 등을 사용할 수 있다. - HASH_SJ 은 hash semi-join 이고, MERGE_SJ 은 sort merge semi-join 이며 NL_SJ 은 nested loop semi-join 이다. - LEADING_HINT /*+ LEADING (table) */ ..
Access Method Hints - AND_EQUAL /*+ AND_EQAUL (table index index [index] [index] [index] */ - 복수의 단일 컬럼을 스캔하여 머지 방식으로 처리하게 한다. - CLUSTER_HINT /*+ CLUSTER (table) */ - 지정 테이블의 클러스터 스캔을 유도한다. 클러스터된 객체에만 사용할 수 있다. - FULL_HINT /*+ FULL (table) */ - 지정한 테이블에 대해 풀 테이블 스캔을 유도한다. - HASH_HINT /*+ HASH (table) */ - 지정한 테이블에 대해 hash 스캔을 수행하도록 유도한다. - 클러스터 테이블 만을 대상으로 한다. - INDEX /*+ INDEX (table index [ind..
Optimization Goals and Approaches - ALL_ROWS /*+ ALL_ROWS */ 최소한의 자원을 사용하여 결과값의 전체를 추출하게 한다. - FIRST_ROWS /*+ FIRST_ROWS (n) */ - 전체 결과값의 반환 대신 지정한 숫자만큼 로우의 결과값을 반환하는데 집중하게 유도한다. - CHOOSE_HINT /*+ CHOOSE */ - Rule-Based 와 Cost-Based 방식 간의 선택을 유도한다. 선택 기준은 사용 객체의 분석 정보 존재 여부이며, 사용되는 객체들 중 하나라도 분석 정보가 존재한다면 Cost-Based 방식을 사용하게 된다. - ROLE /*+ RULE */ - 실행 계획을 Rule-Based 방식으로 실행하게 된다. - 해당 쿼리 블록에 다른..
힌트의 종류 별 분류 1. Optimization Goals and Approaches - ALL_ROWS 혹은 FIRST_ROWS - CHOOSE - RULE 2. Access Method Hints - AND_EQUAL - CLUSTER - FULL - HASH - INDEX 혹은 NO_INDEX - INDEX_ASC 혹은 INDEX_DESC - INDEX_COMBINE - INDEX_FFS - ROWID 3. Join Order Hints - ORDERED - STAR 4. Join Operation Hints - DRIVING_SITE - HASH_SJ, MERGE_SJ 혹은 NL_SJ - LEADING - USE_HASH 혹은 USE_MERGE - USE_NL 5. Parallel Executi..
USE_HASH, FULL, PARALLEL 3가지 힌트절은 배치성 쿼리에서 가장 많이 사용되는 힌트절이다. 한마디로 대용량 데이터 처리 및 조회에 빈번하게 사용하는 힌트절이다. 위의 3가지 힌트절만 잘 조합하여 사용한다면 배치 튜닝에서 전혀 어려움이 없다. 힌트절을 사용함에 있어서 처음부터 3가지를 조합하여 사용하기 보다는 다음의 3단계로 나누어서 사용 여부를 검토해야 한다. 1. USE_HASH 힌트절만 사용해서 조회 가능한지 검토 -> 적당히 무거운 쿼리에 사용 2. 조회 범위가 크다면 FULL 힌트절 추가 사용을 검토 -> 대개 이 단계에서 튜닝 완료 3. 대용량 데이터의 빠른 처리가 요구될 때 PARALLEL 힌트절 사용 -> 제한적 사용 특히 PARALLEL 힌트절은 병렬 처리를 위한 힌트절이..
위 그림처럼 두 개의 조건절에 모두 인덱스가 존재할 때 옵티마이저는 통계정보에 근거해 최소한의 비용이 소요되는 인덱스를 선택할 것이다. 하지만 통계정보가 실제 정보를 반영하지 못하여 옵티마이저가 잘못된 선택을 한다든지 혹은 우리가 원하는 인덱스가 아닐 때는 힌트절을 통해 명시적으로 인덱스를 지정할 수 있다. 추가적으로 아래와 같은 INDEX 관련 힌트절도 있다. 인덱스명 설명(표 만들기) INDEX_SS 결합인덱스의 선행 컬럼 조건이 입력되지 않을 때 사용한다. (INDEX SKIP SCAN) INDEX_FFS 인덱스만을 빠르게 전체 스캔한다. (INDEX FAST FULL SCAN) INDEX_DESC 인덱스를 통하여 데이터를 역순으로 스캔한다. 위 그림을 보면 주문일자 조건절로 구간 조회를 하고 있다..