오라클 주요 힌트 목록

오라클 주요 힌트 목록
힌트분류설명예시
ALL_ROWS최적화 목표전체 결과 집합의 처리 속도 최적화SELECT /*+ ALL_ROWS */ * FROM employees;
FIRST_ROWS(N)최적화 목표초기 응답 시간 최소화SELECT /*+ FIRST_ROWS(10) */ * FROM employees;
FULLACCESS 방식테이블 전체를 스캔 (Full Table Scan)SELECT /*+ FULL(emp) */ * FROM emp;
INDEXACCESS 방식Index Scan으로 유도SELECT /*+ INDEX(emp emp_idx) */ * FROM emp WHERE deptno = 10;
INDEX_DESCACCESS 방식Index를 역순으로 스캔하도록 유도SELECT /*+ INDEX_DESC(emp emp_idx) */ * FROM emp ORDER BY hiredate DESC;
INDEX_FFSACCESS 방식Index Fast Full Scan으로 유도
Fast Full Scan: 인덱스를 전체 스캔하지만 정렬 없이 빠르게
SELECT /*+ INDEX_FFS(emp emp_idx) */ * FROM emp;
INDEX_SSACCESS 방식Index Skip Scan으로 유도
Skip Scan: 인덱스의 선두 컬럼이 조건에 없을 때 사용
SELECT /*+ INDEX_SS(emp emp_composite_idx) */ * FROM emp WHERE job = ‘CLERK’;
ORDEREDJOIN 순서FROM 절에 나열된 순서대로 조인SELECT /*+ ORDERED */ … FROM A, B, C WHERE …;
LEADINGJOIN 순서LEADING 힌트 괄호에 기술한 순서대로 조인
(예) LEADING(T1 T2)
SELECT /*+ LEADING(A B C) */ … FROM A, B, C WHERE …;
SWAP_JOIN_INPUTSJOIN 순서해시 조인 시, BUILD INPUT을 명시적으로 선택
(예) SWAP_JOIN_INPUTS(1)

Nested Loop Join 시 내부/외부 테이블 순서를 바꿈
SELECT /*+ SWAP_JOIN_INPUTS(B) */ … FROM A, B WHERE …;
USE_NLJOIN 방식Nested Loop Join
드라이빙 테이블의 각 행마다 대상 테이블을 반복적으로 조회
SELECT /*+ USE_NL(dept) */ e.empno, e.ename, d.dname
FROM emp e, dept d
WHERE e.deptno = d.deptno;
USE_MERGEJOIN 방식Sort-Merge Join
두 테이블을 정렬 후 병합하여 조인
SELECT /*+ USE_MERGE(dept) */ e.empno, e.ename, d.dname
FROM emp e, dept d
WHERE e.deptno = d.deptno;
USE_HASHJOIN 방식Hash Join
해시 테이블을 만들어 조인 수행
SELECT /*+ USE_HASH(dept) */ e.empno, e.ename, d.dname
FROM emp e, dept d
WHERE e.deptno = d.deptno;
NL_SJJOIN 방식Nested Loop Semi Join
서브쿼리 결과 중 첫 번째 매칭만 찾음
SELECT /*+ NL_SJ(dept) */ e.empno, e.ename
FROM emp e
WHERE EXISTS (
  SELECT /*+ NL_SJ(dept) */ 1 FROM dept d WHERE e.deptno = d.deptno
);
MERGE SJJOIN 방식Merge Semi Join
정렬 후 병합 방식으로 Semi Join 수행
SELECT /*+ MERGE_SJ(dept) */ e.empno, e.ename
FROM emp e
WHERE EXISTS (
  SELECT /*+ MERGE_SJ(dept) */ 1 FROM dept d WHERE e.deptno = d.deptno
);
HASH_SJJOIN 방식Hash Semi Join
해시 기반으로 Semi Join 수행
SELECT /*+ HASH_SJ(dept) */ e.empno, e.ename
FROM emp e
WHERE EXISTS (
  SELECT /*+ HASH_SJ(dept) */ 1 FROM dept d WHERE e.deptno = d.deptno
);
MATERIALIZE서브 쿼리 팩토링WITH 문으로 정의한 집합을 물리적으로 생성하도록 유도
예) WITH /*+ MATERIALIZE */ T AS ( SELECT ···)
SELECT /*+ INLINE */ *
FROM (
  SELECT deptno, COUNT(*) AS emp_count
  FROM emp
  GROUP BY deptno
) v,
dept d
WHERE v.deptno = d.deptno;
INLINE서브 쿼리 팩토링WITH 문으로 정의한 집합을 물리적으로 생성하지 않고 INLINE 처리하도록 유도
예) WITH /*+ INLINE */ T AS (SELECT ···)
SELECT /*+ INLINE */ *
FROM (
  SELECT deptno, COUNT(*) AS emp_count
  FROM emp
  GROUP BY deptno
) v,
dept d
WHERE v.deptno = d.deptno;
MERGE쿼리 변환뷰 머징 유도SELECT /*+ MERGE(v) */ *
FROM (
  SELECT deptno, COUNT(*) AS cnt FROM emp GROUP BY deptno
) v, dept d
WHERE v.deptno = d.deptno;
NO_MERGE쿼리 변환뷰 머징 방지SELECT /*+ NO_MERGE(v) */ *
FROM (
  SELECT deptno, COUNT(*) AS cnt FROM emp GROUP BY deptno
) v, dept d
WHERE v.deptno = d.deptno;
UNNEST쿼리 변환서브쿼리 Unnesting 유도 (서브쿼리를 풀어서 조인으로 변환)SELECT /*+ UNNEST */ *
FROM emp
WHERE empno IN (SELECT empno FROM bonus);
NO_UNNEST쿼리 변환서브쿼리 Unnesting 방지SELECT /*+ NO_UNNEST */ *
FROM emp
WHERE empno IN (SELECT empno FROM bonus);
PUSH_PRED쿼리 변환조인조건 Pushdown 유도SELECT /*+ PUSH_PRED(v) */ *
FROM (
  SELECT * FROM emp
) v
WHERE v.deptno = 10;
NO_PUSH_PRED쿼리 변환조인조건 Pushdown 방지SELECT /*+ NO_PUSH_PRED(v) */ *
FROM (
  SELECT * FROM emp
) v
WHERE v.deptno = 10;
USE_CONCAT쿼리 변환OR 또는 IN-List 조건을 OR-Expansion으로 유도SELECT /*+ USE_CONCAT */ *
FROM emp
WHERE job = ‘CLERK’ OR job = ‘MANAGER’;
NO_EXPAND쿼리 변환OR 또는 IN-List 조건에 대한 OR-Expansion 방지SELECT /*+ NO_EXPAND */ *
FROM emp
WHERE job = ‘CLERK’ OR job = ‘MANAGER’;
PARALLEL병렬 처리테이블 스캔 또는 DML을 병렬방식으로 처리하도록 유도
예) PARALLEL (T12) PARALLEL(T22)
SELECT /*+ PARALLEL(emp 4) */ *
FROM emp
WHERE sal > 3000;
PARALLEL_INDEX병렬 처리인덱스 스캔을 병렬방식으로 처리하도록 유도SELECT /*+ PARALLEL_INDEX(emp emp_sal_idx) */ *
FROM emp
WHERE sal > 3000;
PQ_DISTRIBUTE병렬 처리병렬 수행 시 데이터 분배 방식 결정
outer_method, inner_method는 HASH, BROADCAST, NONE 중 선택
예) PQ_DISTRIBUTE(T1 HASH HASH)
SELECT /*+ PARALLEL(emp) PARALLEL(dept) PQ_DISTRIBUTE(emp HASH HASH) */ *
FROM emp JOIN dept ON emp.deptno = dept.deptno;
APPEND기타Direct-Path Insert 로 유도INSERT /*+ APPEND */ INTO emp_archive
SELECT * FROM emp WHERE hiredate < TO_DATE(‘2000-01-01’, ‘YYYY-MM-DD’);
DRIVING_SITE기타DB Link Remote 쿼리에 대한 최적화 및 실행 주체 지정 (Local 또는 Remote)SELECT /*+ DRIVING_SITE(remote_emp) */ *
FROM emp e, remote_emp@remote_db r
WHERE e.empno = r.empno;
PUSH_SUBQ기타서브쿼리를 가급적 빨리 필터링하도록 유도SELECT /*+ PUSH_SUBQ */ *
FROM emp
WHERE deptno IN (SELECT deptno FROM dept WHERE loc = ‘DALLAS’);
NO_PUSH_SUBQ기타서브쿼리를 가급적 늦게 필터링하도록 유도SELECT /*+ NO_PUSH_SUBQ */ *
FROM emp
WHERE deptno IN (SELECT deptno FROM dept WHERE loc = ‘DALLAS’);

Comments

No comments yet. Why don’t you start the discussion?

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다