DB/Oracle

[Oracle] 옵티마이저 힌트 LEADING 과 INDEX_SS

junnnhhh 2025. 10. 16. 20:28
728x90

이슈)

오늘 현업분께 요청이 왔다. 어떠한 화면에서 조회할 수 있는 기간을 한달로 늘려줄 수 없냐는 문의였다.

근데  해당 화면에서 조회할 때 사용되는 테이블들이 데이터 양도 많고, 조회기간을 늘리면 자칫 운영 환경에서 타임아웃이 발생할 수 있기 때문에 확인을 해보고 말씀드린다고 했다.

 

그래서 쿼리를 뜯어보고 있는데,,, 옵티마이저 힌트 부분에 아래와 같은 구문이 있었다...

/*+ LEADING(table1 table2) INDEX_SS(table1 index1)*/

 

나름 쿼리를 튜닝해보려고 했지만, 저 힌트를 제대로 이해하지 못했다..

그래서 정리를 해본다.

 

LEADING 힌트

→ Join 순서를 지정하는 힌트

Oracle 옵티마이저는 조인 순서를 자동으로 결정하지만, 어떤 경우에서 사용자가 더 효율적인 순서를 알고 있을 때,

해당 힌트(LEADING)을 사용하면 조인 순서를 직접 지정할 수 있다.

SELECT /*+ LEADING(t1 t2 t3) */ ...
FROM table1 t1
JOIN table2 t2 ON ...
JOIN table3 t3 ON ...;

 

LEADING 안에 t1 → t2 → t3 순으로 써져 있는데,

이 순서 그대로 조인을 수행하도록 한다.

 

INDEX_SS 힌트

→ Index Skip Scan

복합 인덱스가 있을 때, 선두 컬럼이 조건에 없더라고 뒤쪽 컬럼으로 인덱스를 사용할 수 있게 하는 방식

SELECT /*+ INDEX_SS(emp emp_idx_deptno_ename) */ *
FROM emp
WHERE ename = 'SMITH';

 

여기서 emp_idx_deptno_ename는 (deptno, ename)으로 구성되어 있다고 가정을 해보자.

조건절에 deptno가 없으므로 INDEX_SS를 이용하여 선두 컬럼인 deptno를 skip하고 ename으로 scan하라고 지시한다.

→ 일반적인 range scan 보다 느릴 수 있으나, full table scan 보다는 빠를 수 있다.

 

뭐 정리는 이렇게 했지만,

운영 DB에서 해당 쿼리로 한달 기간을 잡고 돌려보니 별 이상 없었다.(역시 DBA분이 쿼리 튜닝을 잘해주신 것 같다..)

타임아웃 걱정은 괜한 걱정이였지만, 내가 모르는 부분을 공부할 수 있어서 좋았다.

728x90