문서의 선택한 두 판 사이의 차이를 보여줍니다.
| 다음 판 | 이전 판 | ||
| oracle:hint [2018/02/19 08:29] – 만듦 taekgu | oracle:hint [2025/04/15 10:05] (현재) – 바깥 편집 127.0.0.1 | ||
|---|---|---|---|
| 줄 5: | 줄 5: | ||
| Goal : Best Throughput | Goal : Best Throughput | ||
| 용도 : 전체 RESOURCE 소비를 최소화 시키기 위한 힌트. Cost-Based 접근방식. | 용도 : 전체 RESOURCE 소비를 최소화 시키기 위한 힌트. Cost-Based 접근방식. | ||
| - | 예 : | ||
| <code sql> | <code sql> | ||
| SELECT /*+ALL_ROWS */ | SELECT /*+ALL_ROWS */ | ||
| 줄 26: | 줄 25: | ||
| Group 함수 | Group 함수 | ||
| Distinct | Distinct | ||
| - | 예 : | ||
| <code sql> | <code sql> | ||
| SELECT / | SELECT / | ||
| 줄 36: | 줄 34: | ||
| Goal : Acess되는 테이블에 통계치 존재여부에 따라 Optimizer로 하여금 Rule-Based Approach와 Cost-Based Approach 중 하나를 선택할 수 있게 한다. | Goal : Acess되는 테이블에 통계치 존재여부에 따라 Optimizer로 하여금 Rule-Based Approach와 Cost-Based Approach 중 하나를 선택할 수 있게 한다. | ||
| 용도 : Data Dictionary가 해당테이블에 대해 통계정보를 가지고 있다면 Optimizer는 Cost-Based Approach를 선택하고, | 용도 : Data Dictionary가 해당테이블에 대해 통계정보를 가지고 있다면 Optimizer는 Cost-Based Approach를 선택하고, | ||
| - | 예 : | ||
| <code sql> | <code sql> | ||
| SELECT /*+CHOOSE */ | SELECT /*+CHOOSE */ | ||
| 줄 45: | 줄 42: | ||
| === 4.RULE === | === 4.RULE === | ||
| 용도 : Rule-Based 최적화를 사용하기위해. | 용도 : Rule-Based 최적화를 사용하기위해. | ||
| - | 예 : | ||
| <code sql> | <code sql> | ||
| SELECT /*+RULE */ | SELECT /*+RULE */ | ||
| 줄 56: | 줄 52: | ||
| === 1.FULL === | === 1.FULL === | ||
| 용도 : 해당테이블의 Full Table Scan을 유도. | 용도 : 해당테이블의 Full Table Scan을 유도. | ||
| - | 예 : | ||
| <code sql> | <code sql> | ||
| SELECT / | SELECT / | ||
| 줄 69: | 줄 64: | ||
| === 3.CLUSTER === | === 3.CLUSTER === | ||
| 용도 : 지정된 테이블Access에 Cluster Scan 유도. Cluster된 Objects에만 적용가능. | 용도 : 지정된 테이블Access에 Cluster Scan 유도. Cluster된 Objects에만 적용가능. | ||
| - | 예 : | ||
| <code sql> | <code sql> | ||
| SELECT / | SELECT / | ||
| 줄 77: | 줄 71: | ||
| AND EMP.DEPTNO = DEPT.DEPTNO; | AND EMP.DEPTNO = DEPT.DEPTNO; | ||
| </ | </ | ||
| - | 4.HASH | + | === 4.HASH |
| 용도 : 지정된 테이블Access에 HASH Scan 유도. | 용도 : 지정된 테이블Access에 HASH Scan 유도. | ||
| + | <code sql> | ||
| / | / | ||
| - | 5.HASH_AJ | + | </ |
| + | === 5.HASH_AJ | ||
| 용도 : NOT IN SubQuery 를 HASH Anti-join으로 변형 | 용도 : NOT IN SubQuery 를 HASH Anti-join으로 변형 | ||
| + | <code sql> | ||
| /*+HASH_AJ */ | /*+HASH_AJ */ | ||
| - | 6.HASH_SJ | + | </ |
| + | === 6.HASH_SJ | ||
| 용도 : Correlated Exists Subquery 를 Hash Semi-join으로 변형 | 용도 : Correlated Exists Subquery 를 Hash Semi-join으로 변형 | ||
| + | <code sql> | ||
| /*+HASH_SJ */ | /*+HASH_SJ */ | ||
| - | 7.INDEX | + | </ |
| + | === 7.INDEX | ||
| 용도 : 지정된 테이블access에 Index Scan 유도. | 용도 : 지정된 테이블access에 Index Scan 유도. | ||
| 하나의 Index만 지정되면 Optimizer는 해당index를 이용. | 하나의 Index만 지정되면 Optimizer는 해당index를 이용. | ||
| 여러개의 인덱스가 지정되면 Optimizer가 각 Index의 Scan시 Cost를 분석 한 후 최소비용이 드는 Index사용. 경우에 따라 Optimizer는 여러 Index를 사용한 후 결과를 Merge하는 Acees방식도 선택. | 여러개의 인덱스가 지정되면 Optimizer가 각 Index의 Scan시 Cost를 분석 한 후 최소비용이 드는 Index사용. 경우에 따라 Optimizer는 여러 Index를 사용한 후 결과를 Merge하는 Acees방식도 선택. | ||
| Index가 지정되지 않으면 Optimizer는 테이블의 이용가능한 모든 Index에 대해 Scan Cost를 고려 후 최저비용이 드는 Index Scan을 선택한다. | Index가 지정되지 않으면 Optimizer는 테이블의 이용가능한 모든 Index에 대해 Scan Cost를 고려 후 최저비용이 드는 Index Scan을 선택한다. | ||
| - | 예 : | + | <code sql> |
| SELECT / | SELECT / | ||
| EMPNO, ENAME | EMPNO, ENAME | ||
| FROM EMP | FROM EMP | ||
| - | WHERE DEPTNO=10 | + | WHERE DEPTNO=10; |
| - | 8.INDEX_ASC | + | </ |
| + | === 8.INDEX_ASC | ||
| 용도 : INDEX HINT와 동일 단, | 용도 : INDEX HINT와 동일 단, | ||
| - | 9.INDEX_COMBINE | + | === 9.INDEX_COMBINE |
| 용도 : Index명이 주어지지 않으면 Optimizer는 해당 테이블의 Best Cost 로 선택된 Boolean Combination Index 를 사용한다. Index 명이 주어지면 주어진 특정 Bitmap Index 의 Boolean Combination 의 사용을 시도한다. | 용도 : Index명이 주어지지 않으면 Optimizer는 해당 테이블의 Best Cost 로 선택된 Boolean Combination Index 를 사용한다. Index 명이 주어지면 주어진 특정 Bitmap Index 의 Boolean Combination 의 사용을 시도한다. | ||
| + | <code sql> | ||
| / | / | ||
| - | 10.index_desc | + | </ |
| + | === 10.INDEX_DESC === | ||
| 용도 : 지정된 테이블의 지정된 Index를 이용 Descending으로 Scan 하고자 할 때 사용. | 용도 : 지정된 테이블의 지정된 Index를 이용 Descending으로 Scan 하고자 할 때 사용. | ||
| + | <code sql> | ||
| / | / | ||
| - | 11.INDEX_FFS | + | </ |
| + | === 11.INDEX_FFS | ||
| 용도 : Full Table Scan보다 빠른 Full Index Scan을 유도. | 용도 : Full Table Scan보다 빠른 Full Index Scan을 유도. | ||
| + | <code sql> | ||
| / | / | ||
| - | 12.MERGE_AJ | + | </ |
| + | === 12.MERGE_AJ | ||
| 용도 : NOT IN Subquery를 Merge Anti-join으로 변형 | 용도 : NOT IN Subquery를 Merge Anti-join으로 변형 | ||
| - | /*+MERGE_AJ */ | + | <code sql>/*+MERGE_AJ */</ |
| - | 13.MERGE_SJ | + | === 13.MERGE_SJ |
| 용도 : Correalted EXISTS Subquery를 Merge Semi-join으로 변형 | 용도 : Correalted EXISTS Subquery를 Merge Semi-join으로 변형 | ||
| - | /*+MERGE_SJ */ | + | <code sql>/*+MERGE_SJ */</ |
| - | 14.AND_EQUAL | + | === 14.AND_EQUAL |
| 용도 : Single-column Index의 Merge를 이용한 Access Path 선택. 적어도 두개이상의 Index가 지정되어야한다. | 용도 : Single-column Index의 Merge를 이용한 Access Path 선택. 적어도 두개이상의 Index가 지정되어야한다. | ||
| - | / | + | <code sql>/ |
| - | 15.USE_CONCAT | + | === 15.USE_CONCAT |
| 용도 : 조건절의 OR 를 UNION ALL 형식으로 변형한다. 일반적으로 변형은 비용측면에서 효율적일때만 일어난다. | 용도 : 조건절의 OR 를 UNION ALL 형식으로 변형한다. 일반적으로 변형은 비용측면에서 효율적일때만 일어난다. | ||
| - | / | + | <code sql>/ |
| - | C. JOIN 순서를 결정하는 Hints | + | ==== C. JOIN 순서를 결정하는 Hints ==== |
| - | 1.ORDERED | + | === 1.ORDERED |
| 용도 : FROM절에 기술된 테이블 순서대로 JOIN이 일어나도록 유도. | 용도 : FROM절에 기술된 테이블 순서대로 JOIN이 일어나도록 유도. | ||
| /*+ORDERED */ | /*+ORDERED */ | ||
| - | 예 : | + | <code sql> |
| SELECT /*+ORDERED */ | SELECT /*+ORDERED */ | ||
| TAB1.COL1, | TAB1.COL1, | ||
| 줄 129: | 줄 136: | ||
| WHERE TAB1.COL1=TAB2.COL1 | WHERE TAB1.COL1=TAB2.COL1 | ||
| AND TAB2.COL1=TAB3.COL1; | AND TAB2.COL1=TAB3.COL1; | ||
| - | 2.STAR | + | </ |
| + | == LEADING === | ||
| + | <code sql> | ||
| + | select /*+ leading(b) */ * | ||
| + | from a, b | ||
| + | where a.a=b.a; | ||
| + | </ | ||
| + | <code sql> | ||
| + | select /*+ LEADING(d) USE_NL(e) */ | ||
| + | e.ename, d.dname | ||
| + | from mydept1 d, myemp1 e | ||
| + | where e.deptno = d.deptno; | ||
| + | </ | ||
| + | <code sql> | ||
| + | select /*+ LEADING(d) USE_HASH(e) */ | ||
| + | | ||
| + | from mydept1 d, myemp1 e | ||
| + | where e.deptno = d.deptno; | ||
| + | </ | ||
| + | <code sql> | ||
| + | SELECT /*+ LEADING(E) USE_NL(D) */ E.ENAME, D.DNAME | ||
| + | FROM EMP E, DEPT D | ||
| + | WHERE E.DEPTNO = D.DEPTNO; | ||
| + | |||
| + | SELECT /*+ ORDERED USE_NL(D) */ E.ENAME, D.DNAME | ||
| + | FROM EMP E, DEPT D | ||
| + | WHERE E.DEPTNO = D.DEPTNO; | ||
| + | </ | ||
| + | === 2.STAR | ||
| 용도 : Star Query Plan이 사용가능하다면 이를 이용하기위한 Hint. Star Plan은 규모가 가장큰 테이블이 Query에서 Join Order상 마지막으로 위치하게 하고 Nested Loop 으로 Join이 일어나도록 | 용도 : Star Query Plan이 사용가능하다면 이를 이용하기위한 Hint. Star Plan은 규모가 가장큰 테이블이 Query에서 Join Order상 마지막으로 위치하게 하고 Nested Loop 으로 Join이 일어나도록 | ||
| 유도한다. | 유도한다. | ||
| 적어도 3개 테이블 이상이 조인에 참여해야하며 Large Table의 Concatenated Index는 최소 3컬럼 이상을 Index에 포함해야한다. | 적어도 3개 테이블 이상이 조인에 참여해야하며 Large Table의 Concatenated Index는 최소 3컬럼 이상을 Index에 포함해야한다. | ||
| 테이블이 Analyze 되어 있다면 Optimizer가 가장효율적인 Star Plan을 선택한다. | 테이블이 Analyze 되어 있다면 Optimizer가 가장효율적인 Star Plan을 선택한다. | ||
| - | /*+STAR */ | + | <code sql>/*+STAR */</ |
| - | D. JOIN OPERATION을 결정하는 HINTS. | + | ==== D. JOIN OPERATION을 결정하는 HINTS. |
| - | 1.USE_NL | + | === 1.USE_NL |
| 용도 : 테이블의 Join 시 테이블의 각 Row가 Inner 테이블을 Nested Loop 형식으로 Join 한다. | 용도 : 테이블의 Join 시 테이블의 각 Row가 Inner 테이블을 Nested Loop 형식으로 Join 한다. | ||
| / | / | ||
| - | 예 : | + | <code sql> |
| SELECT /*+ORDERD USE_NL(CUSTOMER) */ | SELECT /*+ORDERD USE_NL(CUSTOMER) */ | ||
| FROM ACCOUNT.BALANCE, | FROM ACCOUNT.BALANCE, | ||
| 줄 145: | 줄 180: | ||
| CUSTOMER.FIRST_NAME | CUSTOMER.FIRST_NAME | ||
| WHERE ACCOUNT.CUSTNO = CUSTOMER.CUSTNO; | WHERE ACCOUNT.CUSTNO = CUSTOMER.CUSTNO; | ||
| - | 2.USE_MERGE | + | </ |
| + | === 2.USE_MERGE | ||
| 용도 : 지정된 테이블들의 조인이 SORT-MERGE형식으로 일어나도록 유도. | 용도 : 지정된 테이블들의 조인이 SORT-MERGE형식으로 일어나도록 유도. | ||
| / | / | ||
| 괄호안의 테이블은 JOIN ORDER상의 뒤의 테이블 | 괄호안의 테이블은 JOIN ORDER상의 뒤의 테이블 | ||
| - | 3.USE_HASH | + | === 3.USE_HASH |
| 용도 : 각 테이블간 HASH JOIN이 일어나도록 유도. | 용도 : 각 테이블간 HASH JOIN이 일어나도록 유도. | ||
| / | / | ||
| 괄호안의 테이블은 JOIN ORDER상의 뒤의 테이블 | 괄호안의 테이블은 JOIN ORDER상의 뒤의 테이블 | ||
| - | 4.DRIVING_SITE | + | === 4.DRIVING_SITE |
| 용도 : QUERY의 실행이 ORACLE에 의해 선택된 SITE가 아닌 다른 SITE에서 | 용도 : QUERY의 실행이 ORACLE에 의해 선택된 SITE가 아닌 다른 SITE에서 | ||
| 일어나도록 유도. | 일어나도록 유도. | ||
| / | / | ||
| - | 예 : | + | <code sql> |
| SELECT / | SELECT / | ||
| FROM EMP, | FROM EMP, | ||
| WHERE EMP.DEPTNO = DEPT.DEPTNO; | WHERE EMP.DEPTNO = DEPT.DEPTNO; | ||
| + | </ | ||
| DRIVING_SITE 힌트를 안쓰면 DEPT의 ROW가 LOCAL SITE로 보내져 | DRIVING_SITE 힌트를 안쓰면 DEPT의 ROW가 LOCAL SITE로 보내져 | ||
| LOCAL SITE에서 JOIN이 일어나지만, | LOCAL SITE에서 JOIN이 일어나지만, | ||