TIL

9.4(2) 옵티마이저 힌트

9.4.2 옵티마이저 힌트

EXPLAIN
SELECT /*+ INDEX(employees ix_firstname) */ *
FROM employees
WHERE first_name='Matt''

MAX_EXECUTION_TIME

SELECT /*+ MAX_EXECUTION_TIME(100) */ *
FROM employees
ORDER BY last_name LIMIT 1;

SET_VAR

SELECT /*+ SET_VAR(optimizer_switch='index_merge_intersection=off') */ *
FROM employees
WHERE first_name='Georgi' AND emp_no BETWEEN 10000 AND 20000;

SEMIJOIN & NO_SEMIJOIN

최적화 전략 힌트
Duplicate Weed-out SEMIJOIN(DUPSWEEDOUT)
First Match SEMIJOIN(FIRSTMATCH)
Loose Scan SEMIJOIN(LOSSESCAN)
Materialization SEMIJOIN(MATERIALZATION)
Table Pull-out 없음
SELECT * FROM departments d
WHERE d.dept_no IN
	(SELECT /*+ SEMIJOIN(MATERIALIZATION) */ de.dept_no
	FROM dept_emp de);

SUBQUERY

최적화 방법 힌트
IN-to-EXISTS SUBQUERY(INTOEXISTS)
Materialization SUBQUERY(MATERIALIZATION)

BNL & NO_BNL & HASHJOIN & NO_HASHJOIN

JOIN_FIXED_ORDER & JOIN_ORDER & JOIN_PREFIX & JOIN_SUFFIX

-- // FROM 절에 명시된 순서대로 조인
SELECT /*+ JOIN_FIXED_ORDER() */ *
FROM employees e
	INNER JOIN dept_emp de ON de.emp_no=e.emp_no
	INNER JOIN departments d ON d.dept_no=de.dept_no;

-- // 일부 테이블에 대해서만 조인 순서를 나열
SELECT /*+ JOIN_ORDER(d, de) */ *
FROM employees e
	INNER JOIN dept_emp de ON de.emp_no=e.emp_no
	INNER JOIN departments d ON d.dept_no=de.dept_no;

-- // 조인의 드라이빙 테이블에 대해서만 조인 순서 나열
SELECT /*+ JOIN_PREFIX(e, de) */ *
FROM employees e
	INNER JOIN dept_emp de ON de.emp_no=e.emp_no
	INNER JOIN departments d ON d.dept_no=de.dept_no;

-- // 조인의 드리븐 테이블에 대해서만 조인 순서 나열
SELECT /*+ JOIN_SIFFIX(de, e) */ *
FROM employees e
	INNER JOIN dept_emp de ON de.emp_no=e.emp_no
	INNER JOIN departments d ON d.dept_no=de.dept_no;

MERGE & NO_MERGE

SELECT /*+ MERGE(sub) */ *
FROM (SELECT * FROM employees WHERE first_name='Matt') sub
LIMIT 10;

INDEX_MERGE & NO_INDEX_MERGE

SELECT /*+ NO_INDEX_MERGE(employees PRIMARY) */ *
FROM employees
WHERE first_name='Georgi' AND emp_no BETWEEN 10000 AND 20000;

NO_ICP

SKIP_SCAN & NO_SKIP_SCAN

SELECT /*+ NO_SKIP_SCAN(employees ix_gender_birthdate) */ gender, birth_date
FROM employees
WHERE birth_date>='1965-02-01';

INDEX & NO_INDEX

SELECT * /*+ INDEX(employees ix_firstname) */ *
FROM employees WHERE first_name='Matt';