SQL 파싱과 최적화

구조적, 집합적, 선언적 질의 언어

SQL 최적화

SQL 옵티마이저

실행계획과 비용

CREATE TABLE T
AS
SELECT D.NO, E.*
FROM SCOOT.EMP E
    , (SELECT ROWNUM NO FROM DUAL CONNECT BY LEVEL <= 1000) D;

CREATE INDEX T_X01 ON T(DEPTNO, NO);
CREATE INDEX T_X02 ON T(DEPTNO, JOB, NO);

-- T에 대한 통계정보 수집
EXEC DBMS_STATS.GATHER_TABLE_STATS(USER, 'T');

-- AutoTrace를 활성화하고 SQL을 실행하면 실행계획 확인 가능
-- 옵티마이저는 T_X01 인덱스를 사용할 것이다. 
SET AUTOTRACE TRACEONLY EXP;

SELECT *
FROM T
WHERE DEPTNO = 10 AND NO = 1;

-- T_X02 인덱스를 사용하는 플랜
SELECT /*+ INDEX(T T_X02) */ *
FROM T
WHERE DEPTNO = 10 AND NO = 1;

-- Full Scan을 하는 플랜
SELECT /*+ INDEX(T T_X02) */ *
FROM T
WHERE DEPTNO = 10 AND NO = 1;

옵티마이저 힌트

SELECT /*+ INDEX(A 고객_PK) */ *
FROM 고객 A
WHERE 고객ID = '0'
분류 힌트 설명
최적화 목표 ALL_ROWS 전체 처리속도 최적화
FIRST_ROWS(n) 최초 N건 응답속도 최적화
엑세스 방식 FULL Table Full Scan으로 유도
INDEX Index Scan으로 유도
INDEX_DESC Index를 역순으로 스캔하도록 유도
INDEX_FFS Index Fast Full Scan으로 유도
INDEX_SS Index Skip Scan으로 유도
조인순서 ORDERED FROM 절에 나열된 순서대로 조인
LEADING LEADING 힌트 괄호에 기술한 순서대로 조인
SWAP_JOIN_INPUTS 해시 조인 시 BUILD INPUT을 명시적으로 선택
조인방식 USE_NL NL 조인으로 유도
USE_MERGE 소트 머지 조인으로 유도
USE_HASH 해시 조인으로 유도
NL_SJ NL 세미조인으로 유도
MERGE_SJ 소트 머지 세미조인으로 유도
HASH_SJ 해시 세미조인으로 유도
서브쿼리 팩토링 MATERIALIZE WITH 문으로 정의한 집합이 물리적으로 생성하도록 유도
INLINE WITH 문으로 정의한 집합이 물리적으로 생성하지 않고 INLINE 처리하도록 유도
쿼리 변환 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 Remote 쿼리에 대한 최적화 및 실행 주체 지정
PUSH_SUBQ 서브쿼리를 가급적 빨리 필터링하도록 유도
NO_PUSH_SUBQ 서브쿼리를 가급적 늦게 필터링하도록 유도

SQL 공유 및 재사용

소프트 파싱 vs 하드 파싱

SGA
Parsing

바인드 변수의 중요성