사용자 도구

사이트 도구


oracle:hint

차이

문서의 선택한 두 판 사이의 차이를 보여줍니다.

차이 보기로 링크

양쪽 이전 판이전 판
다음 판
이전 판
oracle:hint [2018/02/19 08:38] – [A. Initialization Parameter중 OPTIMIZER_MODE 지정가능 값] taekguoracle: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 */
 EMPNO,ENAME EMPNO,ENAME
줄 25: 줄 25:
 Group 함수 Group 함수
 Distinct Distinct
-예 : <code sql>+<code sql>
 SELECT /*+FIRST_ROWS */ SELECT /*+FIRST_ROWS */
 EMPNO,ENAME EMPNO,ENAME
줄 34: 줄 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를 선택하고, 그렇지 않다면 Rule-Based Approach를 선택한다. 용도 : Data Dictionary가 해당테이블에 대해 통계정보를 가지고 있다면 Optimizer는 Cost-Based Approach를 선택하고, 그렇지 않다면 Rule-Based Approach를 선택한다.
-예 : 
 <code sql> <code sql>
 SELECT /*+CHOOSE */ SELECT /*+CHOOSE */
줄 43: 줄 42:
 === 4.RULE === === 4.RULE ===
 용도 : Rule-Based 최적화를 사용하기위해. 용도 : Rule-Based 최적화를 사용하기위해.
-예 : 
 <code sql> <code sql>
 SELECT /*+RULE */ SELECT /*+RULE */
줄 54: 줄 52:
 === 1.FULL === === 1.FULL ===
 용도 : 해당테이블의 Full Table Scan을 유도. 용도 : 해당테이블의 Full Table Scan을 유도.
-예 : 
 <code sql> <code sql>
 SELECT /*+FULL(EMP) */ SELECT /*+FULL(EMP) */
줄 67: 줄 64:
 === 3.CLUSTER === === 3.CLUSTER ===
 용도 : 지정된 테이블Access에 Cluster Scan 유도. Cluster된 Objects에만 적용가능. 용도 : 지정된 테이블Access에 Cluster Scan 유도. Cluster된 Objects에만 적용가능.
-예 : 
 <code sql> <code sql>
 SELECT /*+CLUSTER(EMP) */ SELECT /*+CLUSTER(EMP) */
줄 75: 줄 71:
 AND EMP.DEPTNO = DEPT.DEPTNO; AND EMP.DEPTNO = DEPT.DEPTNO;
 </code> </code>
-4.HASH+=== 4.HASH ===
 용도 : 지정된 테이블Access에 HASH Scan 유도. 용도 : 지정된 테이블Access에 HASH Scan 유도.
 +<code sql>
 /*+HASH(table) */ /*+HASH(table) */
-5.HASH_AJ+</code> 
 +=== 5.HASH_AJ ===
 용도 : NOT IN SubQuery 를 HASH Anti-join으로 변형 용도 : NOT IN SubQuery 를 HASH Anti-join으로 변형
 +<code sql>
 /*+HASH_AJ */ /*+HASH_AJ */
-6.HASH_SJ+</code> 
 +=== 6.HASH_SJ ===
 용도 : Correlated Exists Subquery 를 Hash Semi-join으로 변형 용도 : Correlated Exists Subquery 를 Hash Semi-join으로 변형
 +<code sql>
 /*+HASH_SJ */ /*+HASH_SJ */
-7.INDEX+</code> 
 +=== 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 /*+INDEX(EMP EMPNO_INDEX) */ SELECT /*+INDEX(EMP EMPNO_INDEX) */
 EMPNO, ENAME EMPNO, ENAME
 FROM EMP FROM EMP
-WHERE DEPTNO=10 +WHERE DEPTNO=10; 
-8.INDEX_ASC+</code> 
 +=== 8.INDEX_ASC ===
 용도 : INDEX HINT와 동일 단,ASCENDING 으로 SCAN함을 확실히 하기위함. 용도 : INDEX HINT와 동일 단,ASCENDING 으로 SCAN함을 확실히 하기위함.
-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>
 /*+INDEX_COMBINE(table index) */ /*+INDEX_COMBINE(table index) */
-10.index_desc+</code> 
 +=== 10.INDEX_DESC ===
 용도 : 지정된 테이블의 지정된 Index를 이용 Descending으로 Scan 하고자 할 때 사용. 용도 : 지정된 테이블의 지정된 Index를 이용 Descending으로 Scan 하고자 할 때 사용.
 +<code sql>
 /*+index_desc(table index) */ /*+index_desc(table index) */
-11.INDEX_FFS+</code> 
 +=== 11.INDEX_FFS ===
 용도 : Full Table Scan보다 빠른 Full Index Scan을 유도. 용도 : Full Table Scan보다 빠른 Full Index Scan을 유도.
 +<code sql>
 /*+INDEX_FFS(table index) */ /*+INDEX_FFS(table index) */
-12.MERGE_AJ+</code> 
 +=== 12.MERGE_AJ ===
 용도 : NOT IN Subquery를 Merge Anti-join으로 변형 용도 : NOT IN Subquery를 Merge Anti-join으로 변형
-/*+MERGE_AJ */ +<code sql>/*+MERGE_AJ */</code> 
-13.MERGE_SJ+=== 13.MERGE_SJ ===
 용도 : Correalted EXISTS Subquery를 Merge Semi-join으로 변형 용도 : Correalted EXISTS Subquery를 Merge Semi-join으로 변형
-/*+MERGE_SJ */ +<code sql>/*+MERGE_SJ */</code> 
-14.AND_EQUAL+=== 14.AND_EQUAL ===
 용도 : Single-column Index의 Merge를 이용한 Access Path 선택. 적어도 두개이상의 Index가 지정되어야한다. 용도 : Single-column Index의 Merge를 이용한 Access Path 선택. 적어도 두개이상의 Index가 지정되어야한다.
-/*+AND_EQUAL(Table Index1, Index2...) */ +<code sql>/*+AND_EQUAL(Table Index1, Index2...) */</code> 
-15.USE_CONCAT+=== 15.USE_CONCAT ===
 용도 : 조건절의 OR 를 UNION ALL 형식으로 변형한다. 일반적으로 변형은 비용측면에서 효율적일때만 일어난다. 용도 : 조건절의 OR 를 UNION ALL 형식으로 변형한다. 일반적으로 변형은 비용측면에서 효율적일때만 일어난다.
-/*+USE_CONCAT */ +<code sql>/*+USE_CONCAT */</code> 
-C. JOIN 순서를 결정하는 Hints +==== C. JOIN 순서를 결정하는 Hints ==== 
-1.ORDERED+=== 1.ORDERED ===
 용도 : FROM절에 기술된 테이블 순서대로 JOIN이 일어나도록 유도. 용도 : FROM절에 기술된 테이블 순서대로 JOIN이 일어나도록 유도.
 /*+ORDERED */ /*+ORDERED */
-예 :+<code sql>
 SELECT /*+ORDERED */ SELECT /*+ORDERED */
 TAB1.COL1,TAB2.COL2,TAB3.COL3 TAB1.COL1,TAB2.COL2,TAB3.COL3
줄 127: 줄 136:
 WHERE TAB1.COL1=TAB2.COL1 WHERE TAB1.COL1=TAB2.COL1
 AND TAB2.COL1=TAB3.COL1; AND TAB2.COL1=TAB3.COL1;
-2.STAR+</code> 
 +== LEADING === 
 +<code sql> 
 +select /*+ leading(b) */ * 
 +  from a, b 
 + where a.a=b.a; 
 +</code> 
 +<code sql> 
 +select /*+ LEADING(d) USE_NL(e) */  
 +      e.ename, d.dname  
 +  from mydept1 d, myemp1 e  
 + where e.deptno = d.deptno; 
 +</code> 
 +<code sql> 
 +select /*+ LEADING(d) USE_HASH(e) */  
 +       e.ename, d.dname  
 +  from mydept1 d, myemp1 e  
 + where e.deptno = d.deptno; 
 +</code> 
 +<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; 
 +</code> 
 +=== 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 */</code> 
-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 한다.
 /*+USE_NL(inner_table) */ /*+USE_NL(inner_table) */
-예 :+<code sql>
 SELECT /*+ORDERD USE_NL(CUSTOMER) */ SELECT /*+ORDERD USE_NL(CUSTOMER) */
 FROM ACCOUNT.BALANCE, FROM ACCOUNT.BALANCE,
줄 143: 줄 180:
 CUSTOMER.FIRST_NAME CUSTOMER.FIRST_NAME
 WHERE ACCOUNT.CUSTNO = CUSTOMER.CUSTNO; WHERE ACCOUNT.CUSTNO = CUSTOMER.CUSTNO;
-2.USE_MERGE+</code> 
 +=== 2.USE_MERGE ===
 용도 : 지정된 테이블들의 조인이 SORT-MERGE형식으로 일어나도록 유도. 용도 : 지정된 테이블들의 조인이 SORT-MERGE형식으로 일어나도록 유도.
 /*+USE_MERGE(table) */ /*+USE_MERGE(table) */
 괄호안의 테이블은 JOIN ORDER상의 뒤의 테이블 괄호안의 테이블은 JOIN ORDER상의 뒤의 테이블
-3.USE_HASH+=== 3.USE_HASH ===
 용도 : 각 테이블간 HASH JOIN이 일어나도록 유도. 용도 : 각 테이블간 HASH JOIN이 일어나도록 유도.
 /*+USE_HASH(table) */ /*+USE_HASH(table) */
 괄호안의 테이블은 JOIN ORDER상의 뒤의 테이블 괄호안의 테이블은 JOIN ORDER상의 뒤의 테이블
-4.DRIVING_SITE+=== 4.DRIVING_SITE ===
 용도 : QUERY의 실행이 ORACLE에 의해 선택된 SITE가 아닌 다른 SITE에서 용도 : QUERY의 실행이 ORACLE에 의해 선택된 SITE가 아닌 다른 SITE에서
 일어나도록 유도. 일어나도록 유도.
 /*+DRIVING_SITE(table) */ /*+DRIVING_SITE(table) */
-예 :+<code sql>
 SELECT /*+DRIVING_SITE(DEPT) */ SELECT /*+DRIVING_SITE(DEPT) */
 FROM EMP,DEPT@RSITE FROM EMP,DEPT@RSITE
 WHERE EMP.DEPTNO = DEPT.DEPTNO; WHERE EMP.DEPTNO = DEPT.DEPTNO;
 +</code>
 DRIVING_SITE 힌트를 안쓰면 DEPT의 ROW가 LOCAL SITE로 보내져 DRIVING_SITE 힌트를 안쓰면 DEPT의 ROW가 LOCAL SITE로 보내져
 LOCAL SITE에서 JOIN이 일어나지만, LOCAL SITE에서 JOIN이 일어나지만,
oracle/hint.1519029536.txt.gz · 마지막으로 수정됨: 2025/04/15 10:05 (바깥 편집)