ORACLE·etc

HINT

administrators 2010. 2. 23. 11:43

인덱스로 만들 컬럼은 다음과 같은 기준에서 선택한다.

1. WHERE 절에서 function의 input이 아니면서, 빈번히 사용되는 컬럼들.
2. 선별력이 높은 컬럼들 (테이블에서 10% 미만인 데이터)
3. 크기가 적은 테이블에서는 인덱스를 만들지 않는다.

DB에서 retrieve되는 속도가 느릴 경우, 먼저 Execution Plan을 만들어 보면
어떤 인덱스를 사용하는지 알 수 있다. 만약, User가 기대한 생성한 인덱스를
사용하지 않을 경우, 다음에서 설명하고 있는 Hint 절을 추가하여 retrieval
속도를 향상시킬 수 있다.

Optimizer Hint Syntax
       
  -----> SELECT ----->  /*+  hint 절*/       ------->
       DELETE
       UPDATE
 
또는

  -----> SELECT ----->  --+  hint 절        ------->
       DELETE
       UPDATE

Hint 절에는 다음 조건들을 부여할 수 있다.

1.  FULL(table_name)
 : table을 full scan하길 원할 때 사용함.

2.  INDEX(table_name index_name[index])
 : 특정 index를 사용하도록 할 때 사용함.

3.  INDEX_ASC(table_name index_name[index])

4.  INDEX_DESC(table_name index_name[index])

5.  AND_EQUALS(table_name index_name index_name[index])

6.  ROWID(table_name)

7.  CLUSTER(table_name)

8.  HASH(table_name)

9.  ORDERED

10. USE_MERGE(table_name)

11. USE_NL(table_name)

Hint를 사용하여 특정 index를 사용한 update의 예

(이 결과는 7.3 이상에서 제공되는 auto trace를 사용하는 방법이나
execution plan 또는 tkprof를 이용하여 확인할 수 있다.)

Update /*+ INDEX (e1 e_job) */
Emp e1
SET sal =
        (SELECT    --+ INDEX (e1 e_dept)
                (e1.sal + AVG(e2.sal))/2
         FROM emp e2
         WHERE e2.deptno = e1.deptno)
WHERE job = 'CLERK'
AND deptno BETWEEN 10 AND 40;