이슈)
오늘 현업분께 요청이 왔다. 어떠한 화면에서 조회할 수 있는 기간을 한달로 늘려줄 수 없냐는 문의였다.
근데 해당 화면에서 조회할 때 사용되는 테이블들이 데이터 양도 많고, 조회기간을 늘리면 자칫 운영 환경에서 타임아웃이 발생할 수 있기 때문에 확인을 해보고 말씀드린다고 했다.
그래서 쿼리를 뜯어보고 있는데,,, 옵티마이저 힌트 부분에 아래와 같은 구문이 있었다...
/*+ 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분이 쿼리 튜닝을 잘해주신 것 같다..)
타임아웃 걱정은 괜한 걱정이였지만, 내가 모르는 부분을 공부할 수 있어서 좋았다.
'DB > Oracle' 카테고리의 다른 글
| [Oracle] WITH절이란? (기본 사용법부터 재귀적 WITH절까지) (0) | 2025.10.16 |
|---|---|
| [Oracle] EXISTS 란? (0) | 2025.10.16 |
| [Oracle] NVL, DECODE, COALESCE (0) | 2025.10.16 |
| [Oracle] INSERT 내부에 SELECT절 (0) | 2025.10.16 |
| [Oracle] 병렬처리 parallel (0) | 2025.10.16 |