300x250
오라클 힌트(Oracle Hints)는 SQL 실행 계획을 최적화하기 위해 개발자가 직접 오라클 옵티마이저(Optimizer)에 지시를 내릴 수 있도록 하는 기능입니다. /*+ HINT */ 형식으로 SQL 문 내부에 주석 형태로 작성됩니다.
오라클 힌트 기본 문법
SELECT /*+ HINT_NAME */ column1, column2
FROM table_name;
- /*+ HINT_NAME */ 부분에 적용할 힌트를 작성합니다.
- 여러 개의 힌트를 적용할 수도 있습니다.
주요 오라클 힌트 종류 및 예시
1) 실행 계획 관련 힌트
(1) FULL(table) – 전체 테이블 스캔 강제
SELECT /*+ FULL(emp) */ *
FROM emp
WHERE deptno = 10;
- emp 테이블을 인덱스를 사용하지 않고 Full Table Scan하도록 유도합니다.
(2) INDEX(table index_name) – 특정 인덱스 사용
SELECT /*+ INDEX(emp emp_idx) */ *
FROM emp
WHERE deptno = 10;
- emp 테이블의 emp_idx 인덱스를 사용하도록 유도합니다.
(3) NO_INDEX(table index_name) – 특정 인덱스 사용 금지
SELECT /*+ NO_INDEX(emp emp_idx) */ *
FROM emp
WHERE deptno = 10;
- emp 테이블에서 emp_idx 인덱스를 사용하지 않도록 설정합니다.
(4) ROWID 접근 방식 강제
SELECT /*+ ROWID(emp) */ *
FROM emp
WHERE ROWID = 'AAACpWAABAAABSsAAA';
- ROWID를 이용하여 데이터를 빠르게 접근합니다.
2) 조인 관련 힌트
(5) USE_NL(outer_table inner_table) – NL 조인 강제
SELECT /*+ USE_NL(emp dept) */ emp.*, dept.*
FROM emp, dept
WHERE emp.deptno = dept.deptno;
- Nested Loop Join(NL 조인)을 강제 적용합니다.
(6) USE_HASH(outer_table inner_table) – 해시 조인 강제
SELECT /*+ USE_HASH(emp dept) */ emp.*, dept.*
FROM emp, dept
WHERE emp.deptno = dept.deptno;
- 해시 조인(Hash Join) 방식으로 실행하도록 유도합니다.
(7) ORDERED – 조인 순서 강제
SELECT /*+ ORDERED */ emp.*, dept.*
FROM emp, dept
WHERE emp.deptno = dept.deptno;
- FROM 절에 명시된 순서대로 조인을 수행합니다.
3) 병렬 처리 관련 힌트
(8) PARALLEL(table degree) – 병렬 쿼리 실행
SELECT /*+ PARALLEL(emp 4) */ *
FROM emp;
- emp 테이블을 4개의 병렬 프로세스를 사용하여 조회합니다.
(9) NO_PARALLEL(table) – 병렬 실행 비활성화
SELECT /*+ NO_PARALLEL(emp) */ *
FROM emp;
- emp 테이블을 병렬 처리를 하지 않고 단일 프로세스로 실행합니다.
4) 기타 최적화 힌트
(10) APPEND – INSERT 성능 향상
INSERT /*+ APPEND */ INTO emp_new
SELECT * FROM emp;
- Direct Path Insert를 사용하여 데이터를 빠르게 삽입합니다.
(11) FIRST_ROWS(n) – 응답 시간 최적화
SELECT /*+ FIRST_ROWS(10) */ *
FROM emp
ORDER BY sal DESC;
- 처음 10개의 행을 빨리 가져오는 방식으로 최적화합니다.
(12) ALL_ROWS – 전체 처리량 최적화
SELECT /*+ ALL_ROWS */ *
FROM emp
ORDER BY sal DESC;
- 전체 실행 비용을 최소화하는 방식으로 최적화합니다.
복합 힌트 예제
(1) 특정 인덱스를 사용하고, 병렬 처리를 활성화하며, NL 조인을 강제
SELECT /*+ INDEX(emp emp_idx) PARALLEL(emp 4) USE_NL(emp dept) */
emp.*, dept.*
FROM emp, dept
WHERE emp.deptno = dept.deptno;
- emp 테이블에서 emp_idx 인덱스를 사용
- emp 테이블을 4개 프로세스로 병렬 처리
- Nested Loop 조인 방식 적용
힌트 사용 시 주의점
- 옵티마이저가 항상 힌트를 따르는 것은 아님
- 옵티마이저는 힌트를 무시하고 최적화된 실행 계획을 선택할 수도 있습니다.
- 잘못된 힌트 사용 시 성능 저하 발생 가능
- 적절한 힌트를 사용하지 않으면 오히려 성능이 저하될 수 있음.
- 테스트 필수
- 실행 계획을 확인 (EXPLAIN PLAN)하여 힌트가 적용되었는지 반드시 테스트해야 합니다.
실행 계획 확인 방법
1) EXPLAIN PLAN 사용
EXPLAIN PLAN FOR
SELECT /*+ FULL(emp) */ *
FROM emp;
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY);
- 실행 계획을 확인하여 힌트 적용 여부를 체크합니다.
2) AUTOTRACE 옵션 사용
SET AUTOTRACE ON;
SELECT /*+ FULL(emp) */ * FROM emp;
- SQL 실행과 함께 실제 실행 계획을 확인합니다.
관련 블로그
오라클 통계정보 갱신
오라클 데이터베이스에서 통계정보(Statistics) 갱신은 쿼리 최적화를 위해 매우 중요한 작업입니다. 통계정보가 최신 상태가 아닐 경우, 옵티마이저(Optimizer)가 비효율적인 실행 계획을 선택하여
make2t.tistory.com
300x250
'IT > Oracle' 카테고리의 다른 글
오라클 19c - PDB(Pluggable Database, 플러그형 데이터베이스) (1) | 2025.02.23 |
---|---|
오라클 Job 스케줄링 및 모니터링 (1) | 2025.02.23 |
PL/SQL Function 기본 구조 (0) | 2025.02.23 |
오라클 파티션 인덱스 상태 조회 쿼리 (0) | 2025.02.23 |
오라클 통계정보 갱신 (2) | 2025.02.23 |