문서유형ㅣ기술정보
분야ㅣ관리/환경설정
적용제품버전ㅣ7FS02PS
문서번호ㅣTADTI181
개요
본 문서에서는 System 통계 수집 방법에 대해 설명합니다.
Optimizer 통계는 Database와 Object에 대한 상세한 정보를 나타내고, 쿼리 Optimizer는 SQL문에 대해 가장 좋은 실행 계획을 선택하기 위해 통계를 이용합니다.
방법
1. System 통계
System 통계는 System 성능 수치 정보를 Optimizer에 제공하기 위해 사용되며 I/O, CPU 등 Hardware 성능 수치 를 반영합니다. 이 통계 정보는 Tibero가 처음 기동될 때 측정되며 해당 값을 이용하여 Optimizer가 측정된 값을 참조 합니다.
다음은 System 통계의 사용 예입니다. CPU 속도가 기본 측정되며, Disk I/O는 내부 저장된 기본값을 사용하는 것을 확인할 수 있습니다.
SQL> col sname format a20; SQL> col pname format a10; SQL> col pval2 format a6; SQL> select * from sys._dd_aux_stats; SNAME PNAME PVAL1 PVAL2 -------------------- ---------- ---------- ------ SYSSTATS_INFO STATUS READY SYSSTATS_INFO STARTDT SYSSTATS_INFO STOPDT SYSSTATS_MAIN CPUSPEED 2200.02549 SYSSTATS_MAIN SEEKTM 4 SYSSTATS_MAIN TRFSPEED 4096 SYSSTATS_MAIN SBLKRDTM SYSSTATS_MAIN MBLKRDTM SYSSTATS_MAIN MBLKRDCNT 9 rows selected.
SYSSTATS_MAIN의 각 항목 특성은 다음과 같습니다.
| 항목 | 설명 | Cost 구분 |
|---|---|---|
| SBLKRDTM |
| I/O |
| MBLKRDTM |
| I/O |
| MBLKRDCNT |
| I/O |
| CPUSPEED | CPU 속도 | CPU |
| SEEKTM | Disk seek Time | I/O |
| TRFSPEED | 데이터 전송 속도 | I/O |
SEEKTM, TRFSPEED 항목은 I/O와 관련된 다른 수치들에 영향을 끼치므로 해당 값 조정을 통해 Cost의 계산 수치를 변경할 수 있습니다.
이때 Table Full Scan, Index Fast Full Scan의 Cost는 특히 I/O 수치에 큰 영향을 받으므로 해당 Optimizer의 Scan 알고리즘 선택을 활성화 또는 억제하기 위해 위의 수치들을 조정할 수 있습니다.
다음은 수치 변경에 따른 Cost 계산 수치의 변화에 대한 예입니다.
- System 통계 수치를 초기화하고, Table의 통계 정보를 수집
SQL> CREATE TABLE T (A NUMBER, B CHAR(100)); SQL> INSERT INTO T SELECT LEVEL, LEVEL FROM DUAL CONNECT BY LEVEL<=100000; COMMIT; SQL> CREATE INDEX I ON T(A); SQL> CALL DBMS_STATS.DELETE_SYSTEM_STATS; SQL> CALL DBMS_STATS.GATHER_TABLE_STATS (USER,'T',ESTIMATE_PERCENT=>100,DEGREE=>4);
- Index Range Scan 또는 Full Table Scan 중 Optimizer가 어떤 것을 선택하는지 확인
SQL> set linesize 150
SQL> CALL DBMS_STATS.DELETE_SYSTEM_STATS;
SQL> SELECT SNAME,PNAME,PVAL1 FROM SYS._DD_AUX_STATS;
SNAME PNAME PVAL1
-------------------- ---------- ----------
SYSSTATS_INFO STATUS
SYSSTATS_INFO STARTDT
SYSSTATS_INFO STOPDT
SYSSTATS_MAIN CPUSPEED 2200.02549
SYSSTATS_MAIN SEEKTM 4
SYSSTATS_MAIN TRFSPEED 4096
SYSSTATS_MAIN SBLKRDTM
SYSSTATS_MAIN MBLKRDTM
SYSSTATS_MAIN MBLKRDCNT
9 rows selected.
SQL> set autotrace traceonly exp
SQL> SELECT /*+FULL(T)*/ * FROM T WHERE A<=20000;
Execution Plan
--------------------------------------------------------------------------------
1 TABLE ACCESS (FULL): T (Cost:708, %%CPU:0, Rows:20000)
Predicate Information
--------------------------------------------------------------------------------
1 - filter: ("T"."A" <= 20000) (0.200)
SQL> SELECT /*+INDEX(T)*/ * FROM T WHERE A<=20000;
Execution Plan
--------------------------------------------------------------------------------
1 TABLE ACCESS (ROWID): T (Cost:360, %%CPU:0, Rows:20000)
2
INDEX (RANGE SCAN): I (Cost:45, %%CPU:0, Rows:20000)
SQL> SELECT * FROM T WHERE A<=20000;
Execution Plan
--------------------------------------------------------------------------------
1 TABLE ACCESS (ROWID): T (Cost:360, %%CPU:0, Rows:20000)
2
INDEX (RANGE SCAN): I (Cost:45, %%CPU:0, Rows:20000)
SQ> set autotrace offTable Full Scan의 Cost는 663, Index Range Scan + Rowid Scan의 Cost는 355로 계산되어 Index Range Scan을 선택하였습니다.
- Disk I/O 수치인 TRFSPEED를 변경한 후 재확인
SQL> set linesize 150
SQL> CALL DBMS_STATS.DELETE_SYSTEM_STATS('TRFSPEED', 60000);
SQL> SELECT SNAME,PNAME,PVAL1 FROM SYS._DD_AUX_STATS;
SNAME PNAME PVAL1
-------------------- ---------- ----------
SYSSTATS_INFO STATUS
SYSSTATS_INFO STARTDT
SYSSTATS_INFO STOPDT
SYSSTATS_MAIN CPUSPEED 2200.0268
SYSSTATS_MAIN SEEKTM 4
SYSSTATS_MAIN TRFSPEED 60000
SYSSTATS_MAIN SBLKRDTM
SYSSTATS_MAIN MBLKRDTM
SYSSTATS_MAIN MBLKRDCNT
9 rows selected.
SQL> set autotrace traceonly exp
SQL> SELECT /*+ FULL(T) */ FROM T WHERE A <= 20000;
Execution Plan
------------------------------------------------------------
1 TABLE ACCESS (FULL): T (Cost:225, %%CPU:1, Rows:20000)
SQL> SELECT /*+INDEX(T)*/ * FROM T WHERE A<=20000;
Execution Plan
--------------------------------------------------------------------------------
1 TABLE ACCESS (ROWID): T (Cost:360, %%CPU:0, Rows:20000)
2 INDEX (RANGE SCAN): I (Cost:45, %%CPU:0, Rows:20000
SQL> SELECT * FROM T WHERE A<=20000;
Execution Plan
--------------------------------------------------------------------------------
1 TABLE ACCESS (FULL): T (Cost:225, %%CPU:1, Rows:20000)
SQL> set autotrace offTable Full Scan의 Cost가 190으로 줄어들었다. 이는 Disk Transfer Speed 수치를 높여서 예측 I/O 시간이 단축되 었기 때문입니다.
서버의 Disk 환경에 따라 동일한 쿼리라도 Full Scan, Range Scan의 성능이 차이날 수 있습니다. 이때 환경에 맞춰 수치를 조정하면 보다 나은 성능을 가진 Plan을 추출해낼 수 있습니다.