오라클 힌트(Hint) 구문
/*+ ALL_ROWS */
Goal : Best Throughput
용도 : 전체 RESOURCE 소비를 최소화 시키기 위한 힌트로 Cost-Based 접근방식.
ALL_ROWS는 Full Table Scan을 선호.
CBO(Cost Based Optimization)는 default로 ALL_ROWS를 선택.
/*+ FIRST_ROWS */
Goal : Best Response Time
용도 : 조건에 맞는 첫번째 row를 리턴하기 위한 Resource 소비를 최소화 시키기 위한 힌트로 Cost-Based 접근방식.
특징 : Index Scan 이 가능하다면 Optimizer가 Full Table Scan 대신 Index Scan을 선택.
Index Scan 이 가능하다면 Optimizer가 Sort-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 Optimization과 Cost-Based Optimization 중 하나를 선택.
용도 : Data Dictionary가 해당테이블에 대해 통계정보를 가지고 있다면 Optimizer는 Cost-Based Approach를 선택
Data Dictionary가 해당테이블에 대해 통계정보가 없으면 Rule-Based Approach를 선택.
Hint Level의 CHOOSE는 RBO(Rule Based Optimization)인지 CBO(Cost Based Optimization) 인지를 선택.
/*+ CLUSTER(table_name) */
Cluster Scan을 선택하도록 지정하며 clustered object에만 적용.
/*+ FULL(table_name) */
Table을 Full 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를 오름차순으로 쓰게끔 지정.
Default로 Index Scan은 오름차순
/*+ INDEX_DESC(table_name index_name) */
지정된 index를 내림차순으로 쓰게끔 지정.
max function의 기능을 대신할 수 있음.
/*+ INDEX_FFS(table index) */
Full table scan보다 빠른 Full index scan을 유도.
/*+ ROWID(table) */
Rowid로 Table Scan을 하도록 지정.
/*+MERGE_AJ*/
NOT IN Subquery를 Merge Anti-join으로 변형
/*+MERGE_SJ*/
Correalted EXISTS Subquery를 Merge Semi-join으로 변형
/*+AND_EQUAL(Table Index1, Index2...) */
Single-column Index의 Merge를 이용한 Access Path 선택.
적어도 두개 이상의 Index가 지정되어야 하며 최대 5개까지 지정 가능
/*+USE_CONCAT*/
조건절의 OR 를 UNION ALL 형식으로 변형.
일반적으로 변형은 비용측면에서 효율적일 때만 발생.
/*+ ORDERED */
From절에 기술된 테이블 순서대로 join이 일어나도록 유도
/*+ STAR*/
Star Query Plan이 사용가능 한 경우 이를 이용하기 위한 Hint.
규모가 가장 큰 테이블이 Query에서 Join Order상 마지막으로 위치하게 하고 Nested Loop으로 Join이 일어 나도록 유도.
/*+ USE_NL(table1 table2 ...) */
테이블의 Join 시 테이블의 각 Row가 Inner 테이블을 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)에서 일어나도록 유도.
'SQL' 카테고리의 다른 글
테이블 컬럼 정의서 추출 SQL - PostgreSQL (0) | 2025.03.05 |
---|---|
오라클 여러 행(ROW)을 하나의 컬럼(COLUMN)으로 합치기 (0) | 2024.11.18 |
DBMS별 테이블 컬럼 정의서 추출 - 오라클, MYSQL, MSSQL, CUBRID, SYBASE, TIBERO (0) | 2022.03.29 |
MS SQL 미사용 테이블 확인 SQL (0) | 2022.03.24 |
오라클 패턴 검색 TRANSLATE (0) | 2022.01.22 |