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)
|
'튜닝' 카테고리의 다른 글
[Tibero] SQL Tuning (6) (0) | 2023.06.05 |
---|---|
[Tibero] SQL Tuning (5) (0) | 2023.06.01 |
[Tibero] SQL Tuning (3) (0) | 2023.05.31 |
[Tibero] SQL Tuning (2) (0) | 2023.05.30 |
[Tibero] SQL Tuning (1) (0) | 2023.05.30 |