티스토리 뷰

WEB TIP/Oracle

HINT 종류

제프 2008. 9. 24. 18:54

출처 : DBguide(jhouse)님

+ ALL_ROWS
- /*+ ALL_ROWS */
- 예
SELECT /*+ ALL_ROWS */ empno, ename, sal, job
FROM emp
WHERE empno = 7566;

+ FIRST_ROWS
- /*+ FIRST_ROWS */

+ CHOOSE
- /*+ CHOOSE */

+ RULE
- /*+ RULE */


** HINTs for Access Methods

+ FULL
- /*+ FULL(table) */
- 예
SELECT /*+ FULL(a) Don't use the index on ACCNO */ accno, bal
FROM accounts a
WHERE accno = 7086854;

+ ROWID
- /*+ ROWID(table) */

+ CLUSTER
- /*+ CLUSTER(table) */
- 예
SELECT --+ CLUSTER emp ename, deptno
FROM emp, dept
WHERE dept.deptno = 10 AND
emp.deptno = dept.deptno;

+ HASH
- /*+ HASH(table) */
- CLUSTER 에 저장된 TABLE에만 적용됨.

+ HASH_AJ
- /*+ HASH_AJ */
- a NOT IN subquery -> a hash anti-join 으로 transformation.

+ HASH_SJ
- /*+ HASH_SJ */
- a correlated EXISTS subquery -> a hash semi-join 으로 transformation.

+ INDEX
- /*+ INDEX(table index1 index2 index3 ...) */
- in list predicat에 대해서도 가능.
- Multi-column inlists 는 index 를 사용할 수 없다.

+ INDEX_ASC
- /*+ INDEX_ASC(table index1 index2 index3 ...) */
- INDEX HINT 와 동일

+ INDEX_DESC
- /*+ INDEX_DESC(table index1 index2 index3 ...) */

+ INDEX_FFS
- /*+ INDEX_FFS(table index1 index2 index3 ...) */
- fast full index scan

+ MERGE_AJ
- /*+ MERGE_AJ */
- a NOT IN subquery -> a merge anti-join 으로 transformation.

+ MERGE_SJ
- /*+ MERGE_SJ */
- a correlated EXISTS subquery -> a merge semi-join 으로 transformation.

+ AND_EQUAL
- /*+ AND_EQUAL(table index1 index2 ... index5) */
- 적어도 2개 이상의 index를 지정해야 하고, max로 5개까지 지정 가능.

+ USE_CONCAT
- /*+ USE_CONCAT */
- 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한다.

** HINTs for Join Orders

+ ORDERED
- /*+ ORDERED */

+ STAR
- /*+ STAR */

** HINTs for Join Operations

+ USE_NL
- /*+ USE_NL(table1 table2 ...) */
- 지정된 table이 inner table이 된다. ( inner table <-> driving(outer) table )
- 흔히 ORDERED HINT와 함께 쓴다.

cf) Tuning reference guide 에 의하면 use_nl과 use_merge 는 모두 ordered HINT 와
함께 사용되어져야 하며, 오라클은 이 HINT 가 inner table 인 경우 사용되어진다고
언급하고 있습니다.


+ USE_MERGE
- /*+ USE_MERGE(table1 table2 ...) */

+ USE_HASH
- /*+ USE_HASH(table1 table2 ...) */

+ DRIVING_SITE
-
- query execution이 행해진다.
- rule/cost-based 모두 가능.
- 예
SELECT /*+DRIVING_SITE(dept)*/ * FROM emp, dept@rsite
WHERE emp.deptno = dept.deptno;

** Additional HINTs

+ CACHE
- /*+ CACHE(table) */
- full table scan시 retrieve된 block을 LRU list에서 most recently used end에 놓는다.
즉, memory에 오래 존재하게 한다.
- 예
SELECT /*+ FULL (scott_emp) CACHE(scott_emp) */ ename
FROM scott.emp scott_emp;

+ NOCACHE
- /*+ NOCACHE(table) */
- full table scan시 retrieve된 block을 LRU list에서 least recently used end에 놓는다.
즉, memory에서 금방 내려가게 한다.
- 예
SELECT /*+ FULL (scott_emp) NOCACHE(scott_emp) */ ename
FROM scott.emp scott_emp;

+ MERGE
- /*+ MERGE(view) */
- COMPLEX_VIEW_MERGING = FALSE 로 되어 있을 때
- view 또는 subquery의 내용을 merge가능.

+ NOMERGE
- /*+ NOMERGE(view) */
- COMPLEX_VIEW_MERGING = TRUE 로 되어 있을 때 사용
- view 또는 subquery의 내용을 merge불가능.
- view 또는 subquery자체의 query문에 의한 영향을 많이 받게됨.

+ PUSH_JOIN_PRED


+ NO_PUSH_JOIN_PRED


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

+ STAR_TRANSFORMATION
- /*+ START TRANSFORMATION */

'WEB TIP > Oracle' 카테고리의 다른 글

HINT 사용  (0) 2008.12.17
부서별 랭킹 쉽게 구하기  (0) 2008.09.24
Useful Oracle PL/SQLs  (0) 2007.12.24
테이블 스페이스 & 사용자 생성  (0) 2007.12.18
날짜에 대한 해당월의 주차 구하기  (0) 2006.09.08
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/03   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31
글 보관함