[운영 종료] TmaxTibero Tech Blog

티맥스티베로 공식 블로그는 https://tmaxtibero.blog/ 로 이전되었습니다.

티맥스티베로 공식 블로그 이전 자세히보기

튜닝

[Tibero] SQL Tuning (4)

TmaxTiberotech 2023. 6. 1. 10:19

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