728x90

오라클 힌트(Hint) 구문

 

/*+ ALL_ROWS */

   Goal : Best Throughput

   용도 : 전체 RESOURCE 소비를 최소화 시키기 위한 힌트로 Cost-Based 접근방식.

            ALL_ROWSFull Table Scan을 선호.

            CBO(Cost Based Optimization)defaultALL_ROWS를 선택.

/*+ FIRST_ROWS */

   Goal : Best Response Time

   용도 : 조건에 맞는 첫번째 row를 리턴하기 위한 Resource 소비를 최소화 시키기 위한 힌트로 Cost-Based 접근방식.

   특징 : Index Scan 이 가능하다면 OptimizerFull Table Scan 대신 Index Scan을 선택.

            Index Scan 이 가능하다면 OptimizerSort-Merge 보다 Nested Loop 을 선택.

            Order By절에 의해 Index Scan 이 가능하다면, Sort과정을 피하기 위해 Index Scan을 선택.

            Delete/Update Block 에서는 무시되며 Group  Function, Distinct, For Update 등을 포함한 Select 문에서도 무시됨.

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

/*+ CHOOSE */

   Goal : Access되는 테이블에 통계정보에 따라 Rule-Based OptimizationCost-Based Optimization 중 하나를 선택.

   용도 : Data Dictionary가 해당테이블에 대해 통계정보를 가지고 있다면 OptimizerCost-Based Approach를 선택

            Data Dictionary가 해당테이블에 대해 통계정보가 없으면 Rule-Based Approach를 선택.

            Hint LevelCHOOSERBO(Rule Based Optimization)인지 CBO(Cost Based Optimization) 인지를 선택.

/*+ CLUSTER(table_name) */

   Cluster Scan을 선택하도록 지정하며 clustered object에만 적용.

/*+ FULL(table_name) */

   TableFull Scan하길 원할 때 사용.

/*+ HASH(table) */

   Hash scan을 선택하도록 지정.

   HASHKEYS parameter를 가지고 만들어진 cluster내에 저장된 table에만 적용.

/*+ HASH_AJ */

   NOT IN SubQuery HASH Anti-join으로 변형

/*+ HASH_SJ */

   Correlated Exists Subquery Hash Semi-join으로 변형

/*+ INDEX(table_name index_name) */

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

/*+ INDEX_COMBINE(table_name index_name) */

   Index명이 주어지지 않으면 Optimizer는 해당 테이블의 Best Cost 로 선택된 Boolean Combination Index 를 사용.

   Index 명이 주어지면 주어진 특정 Bitmap Index Boolean Combination 의 사용을 시도.

/*+ INDEX_ASC(table_name index_name) */

   지정된 index를 오름차순으로 쓰게끔 지정.

   DefaultIndex Scan은 오름차순

 

§Access Method
 

/*+ INDEX_DESC(table_name index_name) */

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

   max function의 기능을 대신할 수 있음.

/*+ INDEX_FFS(table index) */

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

/*+ ROWID(table) */

   RowidTable Scan을 하도록 지정.

/*+MERGE_AJ*/

   NOT IN SubqueryMerge Anti-join으로 변형

/*+MERGE_SJ*/

   Correalted EXISTS SubqueryMerge Semi-join으로 변형

/*+AND_EQUAL(Table Index1, Index2...) */

   Single-column IndexMerge를 이용한 Access Path 선택.

   적어도 두개 이상의 Index가 지정되어야 하며 최대 5개까지 지정 가능

/*+USE_CONCAT*/

   조건절의 OR UNION ALL 형식으로 변형.

   일반적으로 변형은 비용측면에서 효율적일 때만 발생.

 

§JOIN
 

/*+ ORDERED */

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

/*+ STAR*/

   Star Query Plan이 사용가능 한 경우 이를 이용하기 위한 Hint.

   규모가 가장 큰 테이블이 Query에서 Join Order상 마지막으로 위치하게 하고 Nested Loop으로 Join이 일어 나도록 유도.

/*+ USE_NL(table1 table2 ...) */

   테이블의 Join 시 테이블의 각 RowInner 테이블을 Nested Loop 형식으로 Join.

   흔히 ORDERED Hint와 함께 사용.

/*+ USE_HASH (table_name) */

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

/*+ USE_MERGE (table_name) */

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

/*+ DRIVING_SITE(table_name) */

   QUERY의 실행이 ORACLE에 의해 선택된 SITE(LOCAL)가 아닌 다른 SITE(REMOTE)에서 일어나도록 유도.

 

 

728x90

+ Recent posts