[SQLP] Hint

파랑·2024년 11월 4일

SQLP

목록 보기
1/4

Q18. 다음 중 옵티마이저 힌트의 의미를 가장 정확히 설명한 것을 고르시오.

  1. DRIVING_SITE : 조인 드라이빙 테이블 선택
  2. SWAP_JOIN_INPUTS : NL조인 순서 변경
  3. UNNEST : 서브쿼리를 풀어서 조인으로 변환
  4. INDEX_FS : Index Full Scan 유도



📝 Hint List

분류 힌트 설명
최적화목표 ALL_ROWS 전체 처리속도 최적화
FIRST_ROWS (N) 최초 N건 응답속도 최적화
엑세스 방식 FULL Table Full Scan
INDEX Index Scan
INDEX_DESC Index 역순으로 scan
INDEX_FFS Index Fast Full Scan
INDEX_SS Index Skip Scan
조인 순서 ORDERED From 절에 나열된 순서로 조인
LEADING ( ) 괄호에 기술한 순서로 조인
SWAP_JOIN_INPUT 해시 조인 시, BUILD INPUT 명시적으로 선택
조인 방식 USE_NL NL 조인
USE_MERGE 소트 머지 조인
USE_HASH HASH 조인
NL_SJ NL 세미 조인
MERGE_SJ 소트 머지 세미 조인
HASH_SJ 해시 세미 조인
서브 쿼리 팩토링 MATERIALIZE WITH 문으로 정의한 집합을 물리적으로 생성
예) WITH /*MATERIALIZE*/ T AS (SELECT ···
INLINE WITH 문으로 정의한 집합을 물리적으로 생성하지 않고 INLINE 처리
예) WITH /*INLINE*/ T AS (SELECT ···
쿼리 변환 MERGE 뷰 머징 유도
NO_MERGE 뷰 머징 방지
UNNEST 서브쿼리 Unnesting 유도
서브쿼리를 풀어서 조인으로 변환
NO_UNNEST 서브쿼리 Unnesting 방지
PUSH_PRED 조인조건 Pushdown 유도
NO_PUSH_PRED 조인조건 Pushdown 방지
USE_CONCAT OR 또는 IN-LIST 조건을 OR-Expansion으로 유도
NO_EXPAND OR 또는 IN-LIST 조건에 대한 OR-Expansion 방지
병렬 처리 PARALLEL 테이블 스캔 또는 DML을 병렬 처리하도록 유도
PARALLEL_INDEX 인덱스 스캔을 병렬 처리하도록 유도
PQ_DISTRIBUTE 병렬 수행 시 데이터 분배 방식 결정
기타 APPEND Direct-Path Insert 유도
DRIVING_SITE DB Link Remot 쿼리 최적화 및 실행 주체 지정
PUSH_SUBQ 서브쿼리를 가급적 빨리 필터링하도록 유도
NO_PUSH_SUBQ 서브쿼리를 가급적 늦게 필터링하도록 유도





/* SWQP_JOIN_INPUT */

해시 조인
1) Bulid Input을 읽어 해시 테이블(해시 맵) 생성
2) Probe Input을 읽어 해시 테이블을 탑색하며 조인
일반적으로 더 작은 테이블을 Bulid Input으로 사용하나, SWQP_JOIN_INPUT힌트를 사용해 명시적으로 바꿀 수 있다.


/*USE_HASH(a)*/ 와 비교
SWAP_JOIN_INPUT(a) : 옵티마이저의 기본 Build Input 선택을 강제하는 것
USE_HASH(a) : 특정 테이블(a)을 Build Input으로 해시 조인을 사용하도록 강제 지정하는 것
→ 두 힌트 모두 특정 테이블(a)을 Build Input으로 강제
→ 해시 조인을 사용하지 않았을 때, SWAP_JOIN_INPUT는 무시



/* PUSH_PRED */

SELECT /*+ PUSH_PRED */ *
  FROM (
    SELECT employee_id, salary
      FROM employees
     WHERE `department_id = 10 AND 
	) emp
 WHERE salary > 5000;

힌트를 사용하지 않는 경우
1) 서브 쿼리에서 department_id = 10인 데이터 조회
2) 1)의 결과에서 salary > 5000인 데이터 조회


힌트를 사용한 경우
department_id = 10 AND salary > 5000;인 데이터 조회



/* USE_CONCAT */

쿼리에서 OR 또는 IN 조건을 포함할 때, OR 조건을 별도의 쿼리로 확장하여 실행하도록 유도한다. 이를 OR-Expansion이라고 한다.
여러 조건을 UNION ALL을 사용한 쿼리 조합으로 확장해 각 조건을 독립적으로 처리한다.


쿼리 예시 (OR조건) :

SELECT /*+ USE_CONCAT */ *
  FROM employees
 WHERE department_id = 10 OR department_id = 20;

쿼리 예시 (IN조건) :

SELECT /*+ USE_CONCAT */ *
FROM employees
WHERE department_id IN (10, 20);

옵티마이저 변환 :

SELECT * FROM employees WHERE department_id = 10
UNION ALL
SELECT * FROM employees WHERE department_id = 20;

SELECT 문이 독립적으로 실행되므로, 조건 칼럼에 대해 각각 인덱스를 사용할 수 있어 성능이 개선될 수 있다.

0개의 댓글