2010년 9월 6일 월요일

[oracle] hints #1

 

힌트 사용 권고 : 힌트는 Join 순서 -> Join 방법 -> 데이터 접근 방식 순으로 사용하는 것을 권장함.

힌트 구분 힌트 내용2 기타
접근방법 /*+  ALL_ROWS  */ CBO mode. 총 자원 소비량 최소화  
/*+  CHOOSE */ Optimizer 가 RBO 나 CBO 선택하도록 함.  
/*+  FIRST_ROWS */ CBO mode. 첫번째 행을 반환하는데 최소화  
/*+  RULE */ RBO mode 선택  
엑세스메소드 /*+  AND_EQUAL(table  index1
                                index2)  */
인덱스 병합을 명시. AND_EQUAL(table index1 index2 ... index5)
적어도 2개 이상의 index를 지정해야 하고, max로 5개까지 지정 가능
 
/*+  CLUSTER (table)              */ Cluster Scan 명시  
/*+  FULL(table)                     */ Full Scan 명시  
/*+  HASH(table)                     */ Hash Scan을 명시적으로 선택  
/*+  HASH_AJ(table)                 */ NOT In sub Query 를 hash
anti join으로 변환하여 table 엑세스
 - Not in, Not exists
/*+  HASH_SJ(table)                */ Exists sub Query 를 hash
semi join으로 변환하여 table 엑세스
 - Exists
/*+  INDEX(table index)            */ 테이블 인덱스 사용  
/*+  INDEX_ASC(table index)     */ 테이블에 대한 오름차순 인덱스 스캔  
/*+  INDEX_COMBINE (table index)*/ 비트맵 인덱스의 부울 조합을 사용  
/*+  INDEX_DESC(table index)   */ 테이블에 대한 내림차순 인덱스 스캔  
/*+  INDEX_FFS(table index)      */ Full Table Scan 대신
Fast Full Index  Scan 수행
Index Fast full scan, Multiblock_read_count 파람에 영향을 받는다.
/*+  MERGE_AJ(table)              */ Not In 하위 질의를 병합 Anti Join  
/*+  MERGE_SJ(table)              */ 상호 관련된 Exists Sub Query 를
 Semi Join 으로 변환
 
/*+  NO_EXPAND                    */ Where 절에 OR 또는 IN 조건을 가지는
 Query에 대해 OR 확장을 안함 
use_concat 의 반대..OR 나 IN 을 확장안함. table 이나 view 필요없음
/*+  NO_INDEX(table index)       */ 인덱스를 지정하지 않으면 해당
Table 에 대해 Index 를 전혀 사용치 않음
 
/*+  NOREWRITE                     */ Query_rewrite_enable = true 를 비활성화  
/*+  ORDERED_PREDICATES     */ 술어 평가 순서를 Select 문의
 Where 절에 지정된 대로 보존
 
/*+  REWRITE(view [ , , ])        */ 질의를 재작성  
/*+  ROWID(table)                   */ Rowid 에 의한 테이블 스캔을 명시  
/*+  USE_CONCAT                  */ Union all 집합 연산자를 사용하여
질의의 Where 절에 있는 결합된
OR 조건을 혼합질의로 변환
combined OR conditions -> a compound query using
the UNION ALL set operator 로 transformation 한다.
- 일반적으로, 이 transformation은 다음과 같은 상황에서
   발생. if concatenations을 사용하는 query의 cost가 그렇지
   않는 cost보다 더 작을 때.
-  inlists processing과 OR-expands all disjunctions를 turns off
조인순서 /*+  ORDERED                   */ From 절 순서대로 Access  - From 절 순서대로 Join 됨. (CBO 의 default 도 from 절 기술 순서대로)
/*+  STAR                          */    - Dimension Table 들의 Cartecian Product 이 생성된 후 Fact table 과의 조인
조인연산 /*+  DRIVING_SITE(table)      */ Remote Site 에서 수행되도록 함.   - 해당 DB 에서 query execution이 행해진다.
  - rule/cost-based 모두 가능.
/*+ LEADING ( table )           */ driving table 선정  
/*+  USE_HASH(table)          */ Hash Join 방식 Join  
/*+  USE_MERGE(table)       */ Sort Merge 방식 Join 흔히 ORDERED Hint와 함께 쓴다.
/*+  USE_NL(table)              */ Nested Loop 방식 Join   - 지정된 table이 inner table이 된다.
     ( inner table <-> driving(outer) table )
  - 흔히 ORDERED Hint와 함께 쓴다.
병렬실행 /*+  APPEND                      */ Insert 키워드 다음에만 사용
/*+ APPEND PARALLEL(T,4)*/
 - 데이터가 단순히 Table의 HWM 이후에 추가
 - 이것은 Redo 를 남기지 않으므로 주의하여 사용바람. 또한 Transaction 종료전에는 자신의 session에서도 Record 확인 불가. 왜냐하면, HWM 이후에 존재하므로…별도의 Segment 에..
/*+  NOAPPEND                 */    
/*+  NOPARALLEL(table)      */ Table 이 parallel 로 되어 있을 경우, Parallel 을 Disable  
/*+  PARALLEL(table)          */ Parallel 처리 parallel 지정시 degree 를 지정하지 않으면, CPU * parallel_threads_per_cpu
만큼의 degree 가 된다
/*+  PARALLEL(table, integer)*/ integer를 지정하지 않으면,
Parallel_threads_per_cpu 매개변수를 계산
DML 일 경우 Parallel 활성 모드에서만 실행
" ALTER SESSION ENABLE PARALLEL DML ; "
/*+  PARALLEL_INDEX         */ /*+ PARALLEL_INDEX(table1, index1, 3, 1) +/  
/*+  PQ_DISTRIBUTE (table,
      outer_distribution,  
      inner_distribution )        */
조인된 테이블의 행을 분산하는
방법 지정
 
/*+  NOPARALLEL_INDEX   */ 인덱스에 대한 Parallel 속성 설정  
기타 /*+  CACHE(table)              */     - full table scan시 retrieve된 block을 LRU list에서
    most recently used end에 놓는다.
    즉, memory에 오래 존재하게 한다.
/*+  NOCACHE(table)          */     - full table scan시 retrieve된 block을 LRU list에서
    least recently used end에 놓는다.
    즉, memory에서 금방 내려가게 한다.
/*+  MERGE(table)             */ 주변 Query 전에 복잡한 뷰나
Sub Query를 평가
  - _COMPLEX_VIEW_MERGING = FALSE 로 되어 있을 때
  - view 또는 subquery의 내용을 merge가능.
/*+  NO_MERGE (view 명)   */
/*+  NOMERGE(view 명)     */
뷰 병합 방지   - _COMPLEX_VIEW_MERGING = TRUE 로 되어 있을 때 사용
  - view 또는 subquery의 내용을 merge불가능.
  - view 또는 subquery자체의 query문에 의한 영향을 많이 받게됨.
/*+  PUSH_PRED(table)  8.1.7     */ 개별 조인 술어를 뷰에 넣는지의
여부를 비용에 준하여 평가
 -  view 안으로 외부 조인 조건을 Pushing 한다. 
/*+  PUSH_JOIN_PRED(table)       */  -  view 안으로 외부 조인 조건을 Pushing 한다. 
/*+  NO_PUSH_PRED(table)  8.1.7*/  조인 술어를 뷰에 넣지 못하도록 함.  -  view 안으로 외부 조인 조건을 Push 하지 않는다. 
/*+  NO_PUSH_JOIN_PRED(table)  */  -  view 안으로 외부 조인 조건을 Push 하지 않는다. 
/*+  PUSH_SUBQ */ 병합되지 않은 Sub Query를 우선적용

이건 view 이름이 필요치 않다.
  - nomerged subqueries가 execution plan에서 가능한 가장
    빠른 위치에서 evaluation되도록 한다.
  - 일반적으로, merge되지 않은 subqueries는
     execution plan에서 마지막 step으로써 수행된다.
    subqueries가 상대적으로 inexpensive하고 rows의
    수를 줄일 수 있다면, subqueries를 더 일찍
    evaluation하는 것이 performance를 향상시킬 것이다.
  - subquery가 remote table에 적용되거나, merge join을
    사용하는 join된 table에 적용된다면 이 hint는 적용되지 않는다.
/*+ ORDERED_PREDICATES */    
/*+  STAR                            */    
/*+  STAR_TRANSACTION       */ 변환된 Star Join  

[출처] 힌트 사용|작성자 날씨맑음

댓글 없음:

댓글 쓰기