공부/sql

힌트(Oracle Hint)란 무엇일까?

hansuya 2025. 5. 8. 05:22

힌트란 SQL 튜닝의 핵심 부분으로 일종의 지시 구문이다.
오라클이 항상 최적의 실행 경로를 만들어 내기는 불가능하기 때문에 직접 최적의 실행경로를 작성해주는 것이다.
사용자가 특정 SQL 문장에서 어떤 인덱스가 선택도가 높은지 알고 있는 경우 Optimizer에 의존한 실행 계획보다 훨씬 효율적인 실행 계획을 구사할 수 있다.
힌트를 사용하여 아래와 같은 것들을 할 수 있다.
액세스 경로, 조인 순서, 병렬 및 직렬 처리, Optimizer 의 목표(Goal)를 변경 가능하다.
모든 힌트의 기본 사용법은 쿼리 서두에 힌트를 명시하는 것이다. 예를 들면

-- index_asc, index 힌트 : 인덱스 영역에서 순방향으로 스캔하라는 뜻
SELECT /*+ index_asc(e idx_myemp1_ename)*/
    EMPNO, ENAME, SAL
FROM MYEMP1 e
WHERE ENAME >= '가'
>>> 앞부분에 +기호가 붙는다는 점에서 주석과의 차이 유의

/*+ INDEX_ASC(table_name index_name)*/ >>> 지정된 index를 오름차순으로 쓰게끔 지정(기본은 오름차순)
/*+ INDEX_DESC(table_name index_name)*/ >>> 지정된 index를 내림차순으로 쓰게끔 지정

SELECT /*+ index_desc(emp pk_emp) */ empno
FROM emp
WHERE rownum = 1;
(위 문장은 제일 큰 것 하나만 조회되므로, max function의 기능을 대신할 수 있다)

SELECT /*+ ORDERD */
    columns ...
FROM 고객 A, 주문 B
WHERE A.고객번호 = B.고객번호
AND A.고객명 = ?
AND B.주문일자 = ?

위 쿼리에서 사용한 ORDERED 힌트절로 인하여 옵티마이저는 고객 -> 주문 방향으로 접근을 진행할 것이다.
FROM  절에 접근 순서대로 테이블을 나열하는 것이 중요하다. 이는 개발자 간에 테이블 접근 순서를 명시적으로 공유하는 방법이자, 오라클 옵티마이저의 잘못된 접근 순서를 ORDERED 힌트절을 사용해 바로잡기에 용이하다.
이에 반해 LEADING 힌트절은 테이블 접근 순서를 명시적으로 표시할 수 있다. ORDERED 힌트절보다 훨씬 개선된 힌트절이다. LEADING 힌트절은 FROM  절에 종속적이지 않다

SELECT /*+ LEADING(B A) */
    columns ...
FROM  고객 A, 주문 B
WHERE A.고객명 = ?
AND A.고객명 = ?
AND B.주문일자 = ?

위 쿼리에서 사용한 LEADING(B A) 힌트절로 인해 주문 -> 고객 방향으로 접근을 진행할 것이다.

테이블 접근 순서에 대한 결정 기준 3가지
1.진입형 테이블을 결정한다 >>> 조건 중에서 조회 범위가 작은 테이블을 우선시
2.연결 확장형보다는 연결 축소형 테이블을 우선한다 >>> 조회 범위 줄어드는 JOIN을 우선한다
3.OUTER JOIN 보다는 INNER JOIN을 우선한다 >>> INNER JOIN 은 조회 범위 축소 가능

'공부 > sql' 카테고리의 다른 글

PIVOT, UNPIVOT  (0) 2025.05.08
LISTAGG  (0) 2025.05.08
SUM(1) vs COUNT(*)  (0) 2025.05.07
테이블 설명 확인  (0) 2025.05.07
RDBMS SQL WITH 사용법(2024.11.20)  (0) 2025.03.10