4. 실행계획
옵티마이저가 생산한, 사용자가 원하는 작업을 가장 효율적으로 수행할 수 있는 최적의 데이터 엑세스 예상 경로를 트리 구조로 표현합니다. 
실행계획에는 SQL 문이 실행될 때 필요한 모든 정보를 포함합니다.
4.1. 실행계획 포함 정보
- 액세스 경로: 어떠한 방법으로 데이터에 접근할 것인가?
(Index Scan, Index Fast Full Scan, Full Table Scan 등) - 조인방법 : 어떤 조인 방법을 사용할 것인가?
 - 조인순서 : 어떠한 조인의 순서로 풀릴 것인가?
 
4.2. 실행계획 확인 방법
Explain Plan
—————————————————————————-
1 HASH JOIN (53,339)
2 TABLE ACCESS (FULL): EMP (4,14)
3 FILTER (49,72)
4 TABLE ACCESS (FULL): DEPT (25,7268)’
실행순서
트리 구조의 최하위 레벨부터 실행합니다.
같은 레벨일 경우 위에서부터 실행합니다.
※예시 실행순서: 4 > 3 > 2 > 1
Note!
Explain Plan은 SQL문의 실행 및 작동법 점검을 위한 명령어 입니다.
SQL문의 액세스 경로 확인 및 튜닝을 위해 SQL문을 분석하여 실행계획 수립 후 PLAN_TABLE에 저장하도록 합니다.
5. 힌트 (Hint)
사용자가 직접 옵티마이저에게 최적의 실행 경로를 알려주는 지시문 입니다.
SQL문에 주석을 추가해 최적화된 특정 행동을 지시할 수 있습니다.
[SELECT | INSERT | UPDATE | DELETE ] /*+ hint [hint] … */
or
[SELECT | INSERT | UPDATE | DELETE ] –+ hint [hint] …
5.1. 힌트 작성 규칙
- 힌트는 반드시 SELECT, INSERT, UPDATE, DELETE 키워드 뒤에만 사용할 수 있습니다.
 - 문법에 맞지 않는 힌트는 주석으로 간주합니다.
 - Table을 지정할 때에는 alias를 사용합니다.
 - 같은 query block 안의 대상만 지정 가능합니다.
 
5.2. 힌트 종류
| 
 프로시저 
 | 
 기능 
 | 
| 
 NO_MERGE  | 
 Query Rewrite 단계에서 특정 뷰에 대한 뷰 병합을 하지 않도록 지시  | 
| 
 NO_MERGE  | 
 최소한의 자원을 사용하여 전체 결과에 대한 처리량이 가장 많도록 지시  | 
| 
 FIRST_ROWS  | 
 첫 로우에서 n 로우까지 가장 빠르게 보여줄 수 있도록 처리  | 
| 
 FULL  | 
 힌트를 명시한 테이블에 대해 풀 테이블 스캔을 하도록 지시  | 
| 
 INDEX  | 
 명시한 테이블에 대해 명시한 인덱스를 사용하는 인덱스 스캔으로 유도  | 
| 
 NO_INDEX  | 
 명시한 테이블에 대해 명시한 인덱스를 사용하는 인덱스 스캔을 하지 않도록 지시  | 
| 
 INDEX_ASC  | 
 명시한 테이블에 대해 명시한 인덱스를 사용하되 오름 차순으로 스캔하도록 지시  | 
| 
 INDEX_DESC  | 
 명시한 테이블에 대해 명시한 인덱스를 사용하되 내림 차순으로 스캔하도록 지시  | 
| 
 NO_INDEX_FFS  | 
 명시한 테이블에 대해 명시한 인덱스를 Fast Full Scan 하지 않도록 지시  | 
| 
 LEADING  | 
 조인에서 먼저 조인되어야 할 테이블의 집합을 명시  | 
| 
 ORDERED  | 
 FROM 절에 명시된 순서대로 조인하도록 지시  | 
| 
 USE_NL  | 
 Nested Loop 조인으로 조인을 하도록 지시  | 
| 
 NO_USE_NL  | 
 Nested Loop 조인을 하지 않도록 지시  | 
| 
 USE_NL_WITH_INDEX  | 
 Nested Loop 조인을 하되 해당 테이블은 인덱스를 사용하여 Nested Loop 조인을 하도록 지시  | 
| 
 USE_MERGE  | 
 Merge 조인으로 조인을 하도록 지시  | 
| 
 NO_USE_MERGE  | 
 Merge 조인을 하지 않도록 지시  | 
| 
 USE_HASH  | 
 해시 조인을 하도록 지시 
  | 
| 
 NO_USE_HASH  | 
 해시 조인을 하지 않도록 지시  | 
5.3. 힌트 참고사항
| 구분 | 설명 | 
| JOIN ORDERING | /*+ LEADING (T1 T3) */ 조인에서 먼저 조인되어야 할 테이블의 집합을 명시 /*+ ORDERED */FROM 절에 명시된 순서대로 조인하도록 지시 위의 2개 함께 사용 불가 – 같이 쓰이면 ORDERED가 먼저 적용, 적용이 불가능할 때는 일부 무시 가능  | 
| JOIN METHOD | /*+ USE_HASH (T1) */ USE_HASH (T): JOIN의 오른쪽 일 경우 HASH로 풀림 LEADING이나 ORDERED와 함께 사용  | 
| TABLE ACCESS METHOD | FULL, INDEX, INDEX_ASC, INDEX_DEC, INDEX_FFS, NO_INDEX 등  /*+ FULL (T1) */ /*+ INDEX (T1 I1) */ or /*+ INDEX (T1) */ /*+ NO_INDEX (T1 I1) */ or /*+ NO_INDEX (T1) */  | 
| VIEW MERGE | VIEW FROM절에 있는 DATA SOURCE, 현재 QUERY BLOCK에서 볼 때 테이블과 동일 => SELECT /*+ NO_MERGE */ * FROM (SELECT * FROM T) TT  | 
| SUBQUERY UNNEST | SUBQUERY PREDICATE이나 SELECT LIST에서 사용되는 하위 쿼리UERY => PREDICATE이나 SELECT LIST에서 사용되는 하위 쿼리 SUBQUERY 사례UERY 사례 => SELECT /*+ NO_UNNEST */ (SELECT A FROM T2) FROM T1 => SELECT /*+ NO_UNNEST */ * FROM T1 WHERE T1.A IN (SELECT B FROM T2)  | 
								

