힌트를 사용할 때 고려되어야 하는 사항 
===================== 

 

PURPOSE 
------- 
힌트를 사용할때 고려되어야 하는 사항 

힌트를 사용하였다는 것은 planㅇ 대한 평가가 Cost Based Optimization를 사용하였다고 
할 수 있다. 
RULE일 경우, 힌트를 제외한 모든 힌트는 optimizer를 선택하는 것이다. 
예를들어 통계정보가 없는 상태에서 힌트를 사용했다면, 일부분의 액세스에 대한 힌트는 
잘못된 실행계획으로 갈 확률이 높다. 
통계정보가 없는 상태에서 특정부분에 대한 액세스에 대한 힌트를 주면 Rule 대신 Cost 
가 사용되는데, 통계정보는 전혀 없는 상태이므로 오류의 가능성이 커지는 것이다. 
이럴때 액세스를 분명하고 완전하게 인트를 통해주는 것이 필요하다. 

힌트는 사용자명을 참조해서는 안된다. Alias를 정의했다면 반드시 Alias를 사용해야 
한다. 그리고 Pl/sql 블럭내에서 사용되는 경우라면 반드시 ''/*+'' 다음에 스페이스가 
존재해야한다. 
또한 3rd Party 툴에서 간혹 힌트를 사용할 수 없는 경우도 있는데 이럴때 
뷰를 통하여 힌트를 정의하면 힌트는 뷰를 액세스하는 메인 절에서의 힌트와 경합하여 
원하는 실행으로 풀리지 않는 경우도 있다. 

힌트를 주어도 원하는 액세스가 이루어 지지 않는 경우는 SQL처리 메카니즘으로 보아 
그러한 액세스가 불가함을 의미하는 경우가 많다는 것도 고려해야한다. 
특히 인라인 뷰나 서브커리를 이용한 액세스때 no merge효과가 나타나는 SQL 형태의 
경우는 원하는 액세스를 유도하기가 어렵다. 

Explanation 
----------- 


Example 
------- 
*+ ALL_ROWS */ 

  ALL_ROWS는 Full Table Scan을 선호하며 CBO(Cost Based Optimization)는 default로 
  ALL_ROWS를 선택 합니다.         
             

/*+ CHOOSE */ 

  Hint Level의 CHOOSE는 RBO(Rule Based Optimization)인지 CBO(Cost Based Optimization) 
  인지를 선택 합니다. 

   만약 주어진 table의 통계 정보가 없다면 Rule Based 접근 방식을 사용 합니다. 


/*+ FIRST_ROWS */ 

   Full Table Scan보다는 index scan을 선호하며 
   Interactive Application인 경우 best response time을 제공 합니다. 

   또한 sort merge join보다는 nested loop join을 선호 합니다. 

/*+ RULE */ 

   Rule Based 접근 방식을 사용하도록 지정 합니다. 


<Access Methods - 접근 방법> 


/*+ CLUSTER(table_name) */ 

  Cluster Scan을 선택하도록 지정한다. 따라서 clustered object들에만 적용 됩니다. 


/*+ FULL(table_name) */ 

  Table을 Full Scan하길 원할 때 사용 합니다. 

 

/*+ HASH(table) */ 

  Hash scan을 선택하도록 지정한다. 
  이 hint는 HASHKEYS parameter를 가지고 만들어진 cluster내에 저장된 table에만 
  적용이 됩니다. 


/*+ INDEX(table_name index_name) */ 

  지정된 index를 강제적으로 쓰게끔 지정 합니다. 


/*+ INDEX_ASC(table_name index_name) */ 

  지정된 index를 오름차순으로 쓰게끔 지정 합니다. 
  Default로 Index Scan은 오름차순 입니다 


/*+ INDEX_DESC(table_name index_name) */ 

  지정된 index를 내림차순으로 쓰게끔 지정 합니다. 

         
    위 문장은 제일 큰 것 하나만 조회되므로, max function의 기능을 대신할 수 있습니다.     


/*+ INDEX_FFS(table index) */ 

  Full table scan보다 빠른 Full index scan을 유도 합니다. 


/*+ ROWID(table) */ 

  Rowid로 Table Scan을 하도록 지정 합니다. 
<Join Orders> 


/*+ ORDERED */ 

  From절에 기술된 테이블 순서대로 join이 일어나도록 유도 합니다. 

<Join Operations> 


/*+ USE_HASH (table_name) */ 

  각 테이블간 HASH JOIN이 일어나도록 유도 합니다. 


/*+ USE_MERGE (table_name) */ 

  지정된 테이블들의 조인이 SORT-MERGE형식으로 일어나도록 유도 합니다. 


<Parallel Execution> 


/*+ NOPARALLEL(table_name) */ 

  NOPARALLEL hint를 사용하면, parallel query option을 사용하지 않도록 할 수 있다. 


/*+ PARALLEL(table_name, degree) */ 

  PARALLEL hint를 사용하면 query에 포함된 table의 degree를 설정할 수 있습니다.