비용모델의 2가지 종류
프로시저명 | 용도 |
---|---|
gather_system_stats | 통계를 수집한다. |
delete_system_stats | 통계를 삭제한다. |
restore_system_stats | 과거시점으로 통계를 되돌린다. |
export_system_stats | 백업테이블로 export한다. |
import_system_stats | 백업테이블의 통계를 딕셔너리로 import한다. |
get_system_stats | 통계값을 조회한다. |
set_system_stats | 통계값을 설정한다. |
SQL> select pname, pval1, pval2 from sys.aux_stats$ where sname = 'SYSSTATS_INFO';
PNAME PVAL1 PVAL2
------------------------------ ---------- ------------------------------
DSTART 07-07-2014 06:53
DSTOP 07-07-2014 06:53
FLAGS 1
STATUS COMPLETED
SQL> select pname, pval1 from sys.aux_stats$ where sname = 'SYSSTATS_MAIN';
PNAME PVAL1
------------------------------ ----------
CPUSPEED
CPUSPEEDNW 3308.9701
IOSEEKTIM 10
IOTFRSPEED 4096
MAXTHR
MBRC
MREADTIM
SLAVETHR
SREADTIM
9 rows selected.
수집항목 | 설명 |
---|---|
CPUSPEEDNW | 1개의 CPU가 처리할 수 있는 초당 오퍼레이션 수 |
IOSEEKTIM | 디스크에서 데이터를 찾는 데 걸리는 평균시간(=1/1000초) |
IOTFRSPEED | 디스크에서 밀리초당 전송 가능한 평균 바이트(기본값 4K) |
MBRC | 멀티블록 읽기 오퍼레이션에서 읽어들이는 블록수 |
-- 일반시스템
exec dbms_stats.gather_system_stats(gathering_mode => 'noworkload');
-- 엑사데이터 (MBRC라는 통계항목이 추가로 수집된다.)
exec dbms_stats.gather_system_stats(gathering_mode => 'exadata');
수집항목 | 설명 |
---|---|
CPUSPEED | 1개의 CPU가 처리할 수 있는 초당 오퍼레이션 수 |
SREADTIM | 싱글블록 읽기 오퍼레이션을 수행하는 데 걸린 평균 시간(=1/1000초) |
MREADTIM | 멀티블록 읽기 오퍼레이션을 수행하는 데 걸린 평균 시간(=1/1000초) |
MBRC | 멀틸블록 읽기 오퍼레이션을 수행하는 동안 읽어들인 평균 블록수 |
MAXTHR | 전체 시스템의 최대 디스크 I/O 처리율 (바이트/초) |
SLAVETHR | 단일 병렬 처리 슬레이브의 평균디스크 I/O 처리율 (바이트/초) |
-- 수집 시작시점과 종료시점을 직접 지정한다.
exec dbms_stats.gather_system_stats(gathering_mode => 'start');
exec dbms_stats.gather_system_stats(gathering_mode => 'stop');
-- 프로시저 실행순간부터 5분 뒤까지만 수집한다.
exec dbms_stats.gather_system_stats(gathering_mode => 'interval', interval => 5);
-- 수동으로 통계정보를 설정할 수 있다.(수동으로 통계를 설정할 경우 이전 통계 데이터를 삭제해야 새로 지정한 통계데이터와 병합되지 않는다.)
BEGIN
dbms_stats.delete_system_stats;
dbms_stats.set_system_stats(pname => 'CPUSPEED', pvalue => 772);
dbms_stats.set_system_stats(pname => 'SREADTIM', pvalue => 5.5);
dbms_stats.set_system_stats(pname => 'MREADTIM', pvalue => 19.4);
dbms_stats.set_system_stats(pname => 'MBRC', pvalue => 53);
dbms_stats.set_system_stats(pname => 'MAXTHR', pvalue => 1136136192);
dbms_stats.set_system_stats(pname => 'SLAVETHR', pvalue => 16870400);
END;
BEGIN
-- 통계를 삭제하고 지정한 날짜의 통계로 복원한다.
dbms_stats.delete_system_stats();
dbms_stats.restore_system_stats(to_date(:now,'YYYYMMDDHH24MISS'));
END;
-- system 유저가 소유한 mystats 테이블에 통계를 저장한다.
dbms_stats.gather_system_stats(gathering_mode => 'noworkload',
statown => 'system',
stattab => 'MYSTATS');
-- 통계용 테이블을 생성한다.
dbms_stats.create_stat_table(owname => user,
stattab => 'MYSTATS',
tblspace => 'user');
-- 통계용 테이블을 삭제한다.
dbms_stats.drop_stat_table(owname => user,
stattab => 'MYSTATS');
VARIABLE now VARCHAR2(14)
BEGIN
SELECT to_char(sysdate,'YYYYMMDDHH24MISS') INTO :now FROM dual;
dbms_stats.delete_system_stats();
dbms_stats.gather_system_stats('noworkload');
END;
/
-- 통계를 삭제하고 수집한 이력이 조회된다.
SELECT operation, start_time,
(end_time-start_time) DAY(1) TO SECOND(0) AS duration
FROM dba_optstat_operations
WHERE start_time > to_date(:now,'YYYYMMDDHH24MISS')
ORDER BY start_time;
OPERATION START_TIME DURATION
-------------------- --------------------------------- ------------
delete_system_stats 16-NOV-17 01.26.22.317823 AM +09: +0 00:00:00
gather_system_stats 16-NOV-17 01.26.22.481168 AM +09: +0 00:00:16
-- 버전 12c 부터는 파라미터도 같이 조회할 수 있다.
SELECT x.*
FROM dba_optstat_operations o,
XMLTable('/params/param'
PASSING XMLType(notes)
COLUMNS name VARCHAR2(20) PATH '@name',
value VARCHAR2(20) PATH '@val') x
WHERE start_time > to_date(:now,'YYYYMMDDHH24MISS')
AND operation = 'gather_system_stats';
NAME VALUE
-------------------- --------------------
gathering_mode noworkload
interval 60
statid
statown
stattab
-- 동일 ROW의 서로 다른 컬럼을 조회할 때의 비용이 20씩 늘어남을 확인 할 수 있다.
CREATE TABLE t (c1 NUMBER, c2 NUMBER, c3 NUMBER,
c4 NUMBER, c5 NUMBER, c6 NUMBER,
c7 NUMBER, c8 NUMBER, c9 NUMBER);
INSERT INTO t VALUES (1, 2, 3, 4, 5, 6, 7, 8, 9);
execute dbms_stats.gather_table_stats(user,'t')
EXPLAIN PLAN SET STATEMENT_ID 'c1' FOR SELECT c1 FROM t;
EXPLAIN PLAN SET STATEMENT_ID 'c2' FOR SELECT c2 FROM t;
EXPLAIN PLAN SET STATEMENT_ID 'c3' FOR SELECT c3 FROM t;
EXPLAIN PLAN SET STATEMENT_ID 'c4' FOR SELECT c4 FROM t;
EXPLAIN PLAN SET STATEMENT_ID 'c5' FOR SELECT c5 FROM t;
EXPLAIN PLAN SET STATEMENT_ID 'c6' FOR SELECT c6 FROM t;
EXPLAIN PLAN SET STATEMENT_ID 'c7' FOR SELECT c7 FROM t;
EXPLAIN PLAN SET STATEMENT_ID 'c8' FOR SELECT c8 FROM t;
EXPLAIN PLAN SET STATEMENT_ID 'c9' FOR SELECT c9 FROM t;
SELECT statement_id, cpu_cost AS total_cpu_cost,
cpu_cost-lag(cpu_cost) OVER (ORDER BY statement_id) AS cpu_cost_1_coll,
io_cost
FROM plan_table
WHERE id = 0
ORDER BY statement_id;
STATEMENT_ID TOTAL_CPU_COST CPU_COST_1_COLL IO_COST
------------ -------------- --------------- -------
c1 35757 3
c2 35777 20 3
c3 35797 20 3
c4 35817 20 3
c5 35837 20 3
c6 35857 20 3
c7 35877 20 3
c8 35897 20 3
c9 35917 20 3
- 강좌 URL : http://www.gurubee.net/lecture/4087
- 구루비 강좌는 개인의 학습용으로만 사용 할 수 있으며, 다른 웹 페이지에 게재할 경우에는 출처를 꼭 밝혀 주시면 고맙겠습니다.~^^
- 구루비 강좌는 서비스 제공을 위한 목적이나, 학원 홍보, 수익을 얻기 위한 용도로 사용 할 수 없습니다.