쿼리 힌트
SQL문 실행시 데이터를 스캐닝 하는 방법을 지시 해주는 구문으로, 오라클 옵티마이저가 아닌 개발자가 직접 최적의 실행 경로를 작성해 주는 것이다.
힌트로 할 수 있는 것
액세스 경로, 조인 순서, 병렬 및 직렬 처리, Optimizer의 목표를 변경
데이터값 정렬
드라이빙 테이블 선정
기본 사용법
쿼리 서두에 힌트를 명시한다
SELECT /*+ index_asc(e idx_myemp1_ename) */
empno, ename, sal
FROM myemp1 e
WHERE ename >= '가'
옵티마이저 지정 값
힌트 | 설명 |
---|---|
all_rows | 전체 resource 소비를 최소화 Cost-Based 접근 방식으로 all_rows를 full table scan 선호 CBO(Cost Based Optimization)는 default로 all_rows를 선택 |
first_rows | 조건에 맞는 첫번째 row를 리턴하기 위한 resource를 최소화 시키기 위한 힌트 Cost-Based 접근방식 Index Scan이 가능하면 옵티마이저가 Full Table Scan 대신 Index Scan을 선택 Index Scan이 가능하면 옵티마이저가 Sort-Merge보다 Nested Loop를 선택 Order By절에 Index Scan이 가능하면, Sort 과정을 피하기 위해 Index Scan을 선택 Delete/UpdateBlock에서 무시 다음을 포함한 Select 문에서 제외 (집합 연산자, Group By For UpDate, Group 함수, Distinct) Full Table Scan 보다는 index scan을 선호하며 Interactive Application인 경우 best response time을 제공 sort merge join보다는 nested loop join 선호 |
rule | Rule Based 접근 방식을 사용하도록 지정 |
Access Methods - 접근 방법
힌트 | 설명 |
---|---|
full(table_name) | table을 full scan하기 원할 때 사용 |
hash(table) | hash scan을 선택하도록 지정 (hashkeys parameter로 만들어진 cluster내에 저장된 table에만 적용) |
cluster(table_name) | Cluster Scan을 선택하도록 지정, Clustered Object만 적용 |
hash_aj | not in subquery를 hash anti-join으로 변형 |
hash_sj | correlated exists subquery를 hash semi-join으로 변형 |
index(table_name index_name) | 지정된 index를 강제적으로 쓰게끔 지정 in list predicat에 대해서도 가능 multi-column inlists는 index를 사용할 수 없다. |
index_combine(table_name index_name) | Index명이 주어지지 않으면 Optimizer는 해당 테이블의 Best Cost로 선택된 Boolean Bombination Index를 사용, Index 명이 주어지면 특정 Bitmap Index의 Boolean Combination의 사용 |
index_asc(table_name index_name) | 지정된 index를 오름차순으로 쓰게끔 지정 (기본 오름차순) |
index_desc(table_name index_name) | 지정된 index를 내림차순으로 쓰게끔 지정 |
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가 지정되어야 함. max로 5개까지 지정 가능 |
use_concat | 조건절의 or를 union all 형식으로 변형한다. 일반적으로 변형은 비용 측면에서 효율적일 때만 일어난다. |
Join Orders
힌트 | 설명 |
---|---|
ordered | from절에 기술된 테이블 순서대로 join이 일어나도록 유도 |
star | star query plan이 사용 가능하다면 이를 이용하기 위한 hint. 규모가 가장 큰 테이블이 query에서 join order상 마지막으로 위치하게 하고, nested loop으로 join이 일어나도록 유도 적어도 3개 테이블 이상이 조인에 참여 large table에 concatenated index는 최소 3컬럼 이상을 index에 포함해야함 테이블이 analyze되어 있다면 optimizer가 가장 효율적인 star plan을 선택 |
Join Operations
힌트 | 설명 |
---|---|
use_nl(table1 table2) | 테이블 Join시 각 row가 inner 테이블을 nested loop형식으로 join. 지정된 table이 inner table이 된다. |
use_hash (table_name) | 각 테이블 간 hash join이 일어나도록 유도 |
use_merge (table_name) | 지정된 테이블들의 조인이 sort_merge 형식으로 일어나도록 유도 |
driving_site (table_name) | 쿼리 실행이 오라클에 의해 선택된 site가 아닌 다른 site에서 일어나도록 유도 |
Parallel Execution
힌트 | 설명 |
---|---|
noparallel (table_name) | prallel query option을 사용하지 않도록 할 수 있음 |
parallel(table_name, degree) | 쿼리에 포함된 테이블의 degree를 설정할 수 있다. |
Additional Hints
힌트 | 설명 |
---|---|
cache(table) | full table scan시에 retrieve된 block을 lru list에서 most recently used end에 놓는다 |
nocache(table) | full table scan시 retrieve된 block을 lru list에서 least recently used end에 놓는다. |
merge(view) | complex_view_merging=false로 되어 있을 때 view 또는 subquery의 내용을 merge 가능 |
nomerge(view) | complex_view_merging=true로 되어 있을 때 사용, view또는 subquery의 내용을 merge 불가능 view또는 subquery자체가 query문에 영향을 많이 받게됨 |
push_subq | nomerged subqueries가 execution plan에서 가장 빠른 위치에서 evaluation 되도록 한다. |
'웹 개발' 카테고리의 다른 글
[Apache MPM] Prefork, Worker, Event (0) | 2021.03.25 |
---|---|
아파치에 대한 설정 Httpd.conf (0) | 2021.03.25 |
도커 (0) | 2021.03.14 |
쿠버네티스 (0) | 2021.03.14 |
XSS (0) | 2021.03.14 |