게시일: Jan 10, 2012 11:17:58 PM
- 옵티마이저의 목표에 따른 힌트
/*+ ALL_ROWS */ : 강제적으로 OPTIMIZER_MODE 파라미터 값을 ALL_ROWS로 설정한 것과 같은 효과를 준다.
/*+ FIRST_ROWS(n) */ : 강제적으로 OPTIMIZER_MODE 파라미터 값을 FIRST_ROWS_n을 솔정한 것과 같은 효과를 준다.
/*+ CHOOSE */ : 과거 RBO(Rule Based Optimizer)가 있을 당시 RBO로 설정된 옵티마이저를 CBO(Cost Based Optimizer)로 변경하고자 할 때 사용된 힌트이다. 10g의 경우 CBO만 남아 있으므로 의미가 없는 힌트지만, 사용할 수는 있다.
- 접근 경로에 따른 힌트
/*+ FULL (table) */ : 파라미터에 명시된 테이블을 FULL TABLE SCAN 방식을 사용하여 접근한다.
/*+ CLUSTER (table) */ : 파라미터에 명시된 테이블을 CLUSTER SCAN 방식을 사용하여 접근한다.
/*+ HASH (table) */ : 파라미터에 명시된 테이블을 HASH SCAN 방식을 사용하여 접근한다.
/*+ INDEX (table index) */ : 파라미터에 명시된 테이블의 인덱스를 사용해서 INDEX SCAN 방식을 사용한다.
/*+ NO_INDEX (table index) */ : 파라미터에 명시된 테이블의 인덱스를 사용하지 않는다.
/*+ INDEX_ASC (table index) */ : 파라미터에 명시된 테이블의 인덱스를 사용하여 오름차순으로 INDEX SCAN 방식을 사용한다.
/*+ INDEX_COMBINE (table index) */ : 파라미터에 명시된 테이블의 인덱스를 사용하여 비트맵 접근 경로를 사용한다. 만약 파라미터를 생략하면 테이블에 대해 가장 비용이 낮은 비트맵 인덱스의 조합을 사용한다.
/*+ INDEX_FFS (table index) */ : FAST FULL INDEX SCAN 방식을 사용한다.
/*+ NO_INDEX_FFS (table index) */ : FAST FULL INDEX SCAN 방식을 사용하지 않는다.
/*+ INDEX_SS (table index) */ : 파라미터에 명시된 테이블의 인덱스를 사용하여 INDEX SKIP SCAN 방식을 사용한다.
- 쿼리 변화에 따른 힌트
/*+ NO_QUERY_TRANSFORMATION */ : 옵티마이저가 쿼리 변환을 수행하지 않도록 한다.
/*+ USE_CONCAT */ : WHERE 조건에서 OR 연산자를 상요한 조건을 UNION ALL로 변환한다. 즉 OR-Expansion 기능을 사용한다.
/*+ NO_EXPAND */ : USE_CONCAT과 반대되는 개념으로 OR 연산자를 사용한 조건을 UNION ALL로 변환하지 않는다.
/*+ REWRITE */ : MView에 대해 쿼리를 다시 작성(Query Rewite 기능)하게 한다.
/*+ MERGE */ : 쿼리에서 사용된 뷰들을 병합하게 한다.
/*+ UNNEST */ : Subquery Unnesting, 즉 서브쿼리가 포함된 문장을 조인 문장으로 변환하도록 한다.
- 조인 순서에 따른 힌트
/*+ LEADING(table...) */ : 파라미터로 명시된 테이블 순서대로 조인을 수행한다.
/*+ ORDERED */ : FROM 절에 먼저 명시된 테이블 순서대로 조인을 수행하게 된다.
- 조인 방법에 따른 힌트
/*+ USE_NL (table) */ : 옵티마이저가 NLJ를 사용하도록 한다.
/*+ USE_NL_WITH_INDEX (table index) */ : 인덱스를 사용하여 NLJ를 사용한다.
/*+ USE_MERGE (table) */ : 옵티마이저가 SMJ를 사용하도록 한다.
/*+ USE_HASH (table) */ : 옵티마이저가 HJ를 사용하도록 한다.
잘 사용하면 좋은 힌트, 하지만 힌트를 남용하지는 말자! (정확한 통계 정보를 기반으로 하는 옵티마이저의 효율성을 이용할 수 없게 되므로...)
통계 정보를 주기적으로 갱신한다면 옵티마이저는 최대한의 효율을 낼 수 있게 실행계획을 변경할 것이다.