TIL

9.3(6) 인비저블 인덱스, 스킵 스캔, 인덱스 정렬 선호

인비저블 인덱스(use_invisible_indexes)

-- // 옵티마이저가 인덱스를 사용하지 못하게 변경
ALTER TABLE employees ALTER INDEX ix_hiredate INVISIBLE;

-- // 옵티마이저가 인덱스를 사용할 수 있게 변경
ALTER TABLE employees ALTER INDEX ix_hiredate VISIBLE;

스킵 스캔(skip_scan)

-- // 현제 세션에서 인덱스 스킵 스캔 활성화
SET optimizer_switch='skip_can=on';

-- // 특정 테이블에 대해 인덱스 스킵 스캔을 사용하도록 힌트 사용
SELECT /*+ SKIP_SCAN(employees)*/ COUNT(*)
FROM employees
WHERE birth_date>='1965-02-01';

-- // 특정 테이블에 대해 인덱스 스킵 스캔을 사용하지 않도록 힌트 사용
SELECT /*+ NO_SKIP_SCAN(employees)*/ COUNT(*)
FROM employees
WHERE birth_date>='1965-02-01';

인덱스 정렬 선호(prefer_ordering_index)

EXPLAIN SELECT * 
FROM employees
WHERE hire_date BETWEEN '1995-01-01' AND '1995-02-01'
ORDER BY emp_no;
-- // 현재 커넥션에서만 비활성화
SET SESSION optimizer_switch='prefer_ordering_index=OFF';

-- // 현재 쿼리에 대해서만 비활성화
SELECT /*+ SET_VAR(optimizer_switch='prefer_ordering_index=OFF') */
...
FROM
...