[운영 종료] TmaxTibero Tech Blog

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

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

튜닝

[Tibero] SQL Tuning (12)

TmaxTiberotech 2023. 6. 13. 10:43

본 문서에서는 상황에 따른 다양한 Tuning 사례를 안내 합니다.

Tuning 사례

1. WHERE 절 함수 변환

EXAMPLE

SELECT * FROM T
WHERE C1 = NVL(?, C1)

 

NVL, JOIN Prediacate로 인해 selectivity 계산이 부정확해집니다.

​1.1. ? = NULL

?가 NULL이면 C1=C1, selectivity는 1 입니다.

? is NULL이면 항상 true 입니다.

1.2. ? is not NULL

?가 NULL이 아니면 C1=? 입니다.

WHERE 절 함수 변환 예시
그림15. WHERE 절 함수 변환 예시

 

Where 절 함수는 'C1=?' 또는 '? is NULL' 로 변경할 수 있습니다.

2.통계 분포가 고르지 못한 경우

2.1. 조건문의 Selectivity

EXAMPLE

D.START_DATE <= '20130521' AND

D.END_DATE >= '20130521’

위 조건을 만족하는 실제 Row 개수 확인 결과 입니다.

또한 통계 정보에서는 이상이 없음을 확인할 수 있습니다.

 

SQL> SELECT COUNT(*) FROM TSFA_ROUTECUST_MST
WHERE START_DATE <= '20130521' AND END_DATE >= '20130521';
  COUNT(*)
---------------
        68962
1 row selected.
Execution Plan
------------------------------------------------------------------------------------------------------------------
1 COLUMN PROJECTION (Cost:181, %CPU:0, Rows:1)
2   SORT AGGR (Cost:181, %CPU:0, Rows:1)
3     FILTER (Cost:181, %CPU:0, Rows:1)
4       INDEX (FAST FULL SCAN): PK_TSFA_ROUTCUST_MST (Cost:180, %CPU:0, Rows :69200)

 

START_DATE와 END_DATE 조건을 따로 제시합니다.

 

SQL> SELECT COUNT(*) FROM TSFA_ROUTECUST_MST WHERE START_DATE <= '20130521';
  COUNT(*)
---------------
        68962
Predicate Information
--------------------------------------------------------------------------------
3 - filter: ("TSFA_ROUTECUST_MST"."START_DATE" <= '20130521') (1.000)
SQL> SELECT COUNT(*) FROM TSFA_ROUTECUST_MST WHERE END_DATE >= '20130521';
  COUNT(*)
---------------
       68962
Predicate Information
--------------------------------------------------------------------------------
3 - filter: ("TSFA_ROUTECUST_MST"."END_DATE" >= '20130521') (0.000)

 

END_DATE값 분포입니다.

모든 Row가 '20130521' 조건을 만족합니다.

 

SELECT COUNT(*), END_DATE FROM TSFA_ROUTECUST_MST GROUP BY END_DATE;
 
COUNT(*) END_DATE
---------------- ----------------
                  1 21030513
         68960  99991231
                  1 21030520

2.2. 예측 Row 수가 의심될 경우

특정 테이블에 대한 예측 row 수에 이상이 있을 경우, 우선 통계 정보를 확인합니다.

 

select h.*
from sys._dd_histogram h, sys._dd_hist_head hh, sys._dd_obj o
where o.name=‘테이블이름
   and o.obj_id=hh.obj_id
   and hh.hist_head_id = h.hist_head_id
order by hh.col_no, h.bucket;

 

통계 정보에 문제가 없을 시, 실 데이터 분포도를 확인합니다.

 

SELECT COUNT(*), C1 FROM T GROUP BY C1

 

SELECT MIN(C1), MAX(C1) FROM T

 

분포가 고르지 못할 경우, 통계정보 수집 옵션을 변경합니다.

 

call DBMS_STATS.GATHER_TABLE_STATS(user, ‘T’,
method_opt=>’FOR ALL COLUMNS SIZE {10 이상의 값 권장}

 

'튜닝' 카테고리의 다른 글

[Tibero] SQL Tuning (14)  (0) 2023.06.14
[Tibero] SQL Tuning (13)  (0) 2023.06.13
[Tibero] SQL Tuning (11)  (0) 2023.06.12
[Tibero] SQL Tuning (10)  (0) 2023.06.09
[Tibero] SQL Tuning (9)  (0) 2023.06.08