SQL> select * from v$version;
BANNER
-----------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production
PL/SQL Release 11.2.0.3.0 - Production
CORE 11.2.0.3.0 Production
TNS for Linux: Version 11.2.0.3.0 - Production
NLSRTL Version 11.2.0.3.0 - Production
SQL> analyze table emp compute statistics for table;
테이블이 분석되었습니다.
SQL> analyze table emp estimate statistics sample 5000 rows for table;
테이블이 분석되었습니다.
SQL> analyze table emp estimate statistics sample 50 percent for table;
테이블이 분석되었습니다.
SQL> CREATE UNIQUE INDEX SCOTT.PK_EMP_TEST1 ON SCOTT.EMP_TEST1(EMPNO);
인덱스가 생성되었습니다.
SQL> ALTER TABLE SCOTT.EMP_TEST1 ADD (
2 CONSTRAINT PK_EMP_TEST1
3 PRIMARY KEY
4 (EMPNO)
5 USING INDEX SCOTT.PK_EMP_TEST1);
테이블이 변경되었습니다.
SQL> SELECT NUM_ROWS, BLOCKS, EMPTY_BLOCKS, AVG_SPACE, AVG_ROW_LEN, AVG_SPACE_FREELIST_BLOCKS, NUM_FREELIST_BLOCKS
2 , SAMPLE_SIZE, LAST_ANALYZED
3 FROM DBA_TABLES
4 WHERE OWNER = 'SCOTT'
5 AND TABLE_NAME = 'EMP_TEST1'
6 ;
NUM_ROWS BLOCKS EMPTY_BLOCKS AVG_SPACE AVG_ROW_LEN AVG_SPACE_FREELIST_BLOCKS NUM_FREELIST_BLOCKS SAMPLE_SIZE LAST_ANA
---------- ---------- ------------ ---------- ----------- ------------------------- ------------------- ----------- --------
SQL> begin
2 dbms_stats.gather_table_stats( 'scott', 'EMP_TEST1', cascade=>false, method_opt=> 'for columns' );
3 end;
4 /
PL/SQL 처리가 정상적으로 완료되었습니다.
SQL>
SQL> SELECT NUM_ROWS, BLOCKS, EMPTY_BLOCKS, AVG_SPACE, AVG_ROW_LEN, AVG_SPACE_FREELIST_BLOCKS, NUM_FREELIST_BLOCKS
2 , SAMPLE_SIZE, LAST_ANALYZED
3 FROM DBA_TABLES
4 WHERE OWNER = 'SCOTT'
5 AND TABLE_NAME = 'EMP_TEST1';
NUM_ROWS BLOCKS EMPTY_BLOCKS AVG_SPACE AVG_ROW_LEN AVG_SPACE_FREELIST_BLOCKS NUM_FREELIST_BLOCKS SAMPLE_SIZE LAST_ANA
---------- ---------- ------------ ---------- ----------- ------------------------- ------------------- ----------- --------
14 4 0 0 38 0 0 14 12/12/07
-- 인덱스 통계 수집
analyze INDEX emp_pk compute statistics;
-- 테이블에 속한 모든 인덱스 통계 수집
analyze table emp compute statistics for ALL INDEXES;
-- 테이블과 인덱스 통계를 함께 수집
analyze table emp compute statistics for TABLE for ALL INDEXES;
-- 테이블 통계만 돌렸는데... ;;
SQL> SELECT BLEVEL, LEAF_BLOCKS, CLUSTERING_FACTOR, NUM_ROWS, DISTINCT_KEYS
2 , AVG_LEAF_BLOCKS_PER_KEY, AVG_DATA_BLOCKS_PER_KEY
3 , SAMPLE_SIZE, LAST_ANALYZED
4 FROM DBA_INDEXES
5 WHERE OWNER = 'SCOTT'
6 AND TABLE_NAME = 'EMP_TEST1';
BLEVEL LEAF_BLOCKS CLUSTERING_FACTOR NUM_ROWS DISTINCT_KEYS AVG_LEAF_BLOCKS_PER_KEY AVG_DATA_BLOCKS_PER_KEY SAMPLE_SIZE LAST_ANA
---------- ----------- ----------------- ---------- ------------- ----------------------- ----------------------- ----------- --------
0 1 1 14 14 1 1 14 12/12/07
--특정 인덱스 통계만 수집
SQL> begin
2 dbms_stats.gather_index_stats( ownname => 'scott', indname => 'PK_EMP_TEST1' );
3 end;
4 /
PL/SQL 처리가 정상적으로 완료되었습니다.
SQL> SELECT BLEVEL, LEAF_BLOCKS, CLUSTERING_FACTOR, NUM_ROWS, DISTINCT_KEYS
2 , AVG_LEAF_BLOCKS_PER_KEY, AVG_DATA_BLOCKS_PER_KEY
3 , SAMPLE_SIZE, LAST_ANALYZED
4 FROM DBA_INDEXES
5 WHERE OWNER = 'SCOTT'
6 AND TABLE_NAME = 'EMP_TEST1'
7 ;
BLEVEL LEAF_BLOCKS CLUSTERING_FACTOR NUM_ROWS DISTINCT_KEYS AVG_LEAF_BLOCKS_PER_KEY AVG_DATA_BLOCKS_PER_KEY SAMPLE_SIZE LAST_ANA
---------- ----------- ----------------- ---------- ------------- ----------------------- ----------------------- ----------- --------
0 1 1 14 14 1 1 14 12/12/07
-- 테이블에 속한 모든 인덱스 통계도 같이 수집
begin
dbms_stats.gather_table_stats( 'scott', 'EMP_TEST1', cascade=>true ); -- cascade : 디폴트 true
end;
/
-- 생성 및 재생성 할때 같이 생성( 인덱스 통계 )
create index emp_ename_idx on emp( ename ) COMPUTE STATISTICS;
alter index emp_ename_idx rebuild COMPUTE STATISTICS;
-- 10g 부터는 사용자가 이 옵션을 면시하지 않아도 오라클이 알아서 인덱스 통계까지 수집해 준다 ( _optimizer_compute_index_stats=false )
-- 컬럼 통계만 수집( 오라클 기본 SIZE : 75, 히스토그램 미생성하고플때 : 1 )
analyze table emp compute statistics for ALL COLUMNS SIZE 254
-- 일부 컬럼만 수집
analyze table emp compute statistics for COLUMNS ENAME SIZE 10, SAL SIZE 20;
-- 히스토그램 버킷 개수를 컬럼별로 지정하지 않고 똑같이 20으로 지정할때
analyze table emp compute statistics for COLUMNS SIZE 20 ENAME, SAL, HIREDATE;
-- 인덱스, 테이블, 컬럼 통계를 동시에 수집
analyze table emp compute statistics
for table
for all indexes
for all indexe columns size 254
-- dbms_stats 패키지는 컬럼 통계만 따로 수집하는 방법은 없음 ( 테이블 통계와 항상 같이 수집 )
SQL> COLUMN NUM_DISTINCT FORMAT A1;
SQL> COLUMN LOW_VALUE FORMAT A5;
SQL> COLUMN NUM_DISTINCT FORMAT A1
SQL> COLUMN LOW_VALUE FORMAT A5
SQL> COLUMN HIGH_VALUE FORMAT A5
SQL> COLUMN DENSITY FORMAT A20
SQL> COLUMN NUM_NULLS FORMAT A1
SQL> COLUMN NUM_BUCKETS FORMAT A1;
SQL> SELECT NUM_DISTINCT, LOW_VALUE, HIGH_VALUE, DENSITY, NUM_NULLS, NUM_BUCKETS
2 , LAST_ANALYZED, SAMPLE_SIZE, AVG_COL_LEN, HISTOGRAM
3 FROM DBA_TAB_COLUMNS
4 WHERE OWNER = 'SCOTT'
5 AND TABLE_NAME = 'EMP_TEST1'
6 AND COLUMN_NAME = 'DEPTNO';
NUM_DISTINCT LOW_V HIGH_ DENSITY NUM_NULLS NUM_BUCKETS LAST_ANA SAMPLE_SIZE AVG_COL_LEN HISTOGRAM
------------ ----- ----- ---------- ---------- ----------- -------- ----------- ----------- ---------------
NONE
--위에서 생성안함
SQL> begin
2 dbms_stats.gather_table_stats( 'scott', 'EMP_TEST1', cascade=>true ); -- cascade : 디폴트 true
3 end;
4 /
SQL> SELECT NUM_DISTINCT, LOW_VALUE, HIGH_VALUE, DENSITY, NUM_NULLS, NUM_BUCKETS
2 , LAST_ANALYZED, SAMPLE_SIZE, AVG_COL_LEN, HISTOGRAM
3 FROM DBA_TAB_COLUMNS
4 WHERE OWNER = 'SCOTT'
5 AND TABLE_NAME = 'EMP_TEST1'
6 AND COLUMN_NAME = 'DEPTNO';
NUM_DISTINCT LOW_V HIGH_ DENSITY NUM_NULLS NUM_BUCKETS LAST_ANA SAMPLE_SIZE AVG_COL_LEN HISTOGRAM
------------ ----- ----- --------------------- --------- ----------- -------- ----------- ----------- ----------
3 C10B C11F 0 0 1 12/12/07 14 3 NONE <-- ;;
PL/SQL 처리가 정상적으로 완료되었습니다.
-- 컬럼 히스토그램 조회
SQL> SELECT ENDPOINT_VALUE, ENDPOINT_NUMBER
2 FROM DBA_HISTOGRAMS
3 WHERE OWNER = 'SCOTT'
4 AND TABLE_NAME = 'EMP_TEST1'
5 AND COLUMN_NAME = 'DEPTNO'
6 ORDER BY ENDPOINT_VALUE;
ENDPOINT_VALUE ENDPOINT_NUMBER
-------------- ---------------
10 0
30 1
SQL> COLUMN sname FORMAT A20;
SQL> COLUMN pname FORMAT A10;
SQL> COLUMN pval1 FORMAT 9999999999999999999999999999;
SQL> COLUMN pval2 FORMAT A20;
SQL> select sname, pname, pval1, pval2 from sys.aux_stats$;
SNAME PNAME PVAL1 PVAL2
-------------------- ---------- ----------------------------- --------------------
SYSSTATS_INFO STATUS COMPLETED
SYSSTATS_INFO DSTART 09-17-2011 10:21
SYSSTATS_INFO DSTOP 09-17-2011 10:21
SYSSTATS_INFO FLAGS 1
SYSSTATS_MAIN CPUSPEEDNW 1752 -- NoWorkload
SYSSTATS_MAIN IOSEEKTIM 10 -- NoWorkload
SYSSTATS_MAIN IOTFRSPEED 4096 -- NoWorkload
SYSSTATS_MAIN SREADTIM -- Workload
SYSSTATS_MAIN MREADTIM -- Workload
SYSSTATS_MAIN CPUSPEED -- Workload
SYSSTATS_MAIN MBRC -- Workload
SYSSTATS_MAIN MAXTHR -- Workload
SYSSTATS_MAIN SLAVETHR -- Workload
-- 1. 시스템 통계를 담을 테이블을 생성한다. ( mystats )
begin
dems_stats.create_stat_table(
ownname => user
, stattab => 'mystats'
, global_temporary => FALSE
);
end;
/
-- 2. 시스템 통계를 수집한다.
--방법1
begin
dems_stats.gather_system_stats(
gathering_mode => 'interval'
, interval => 720 --720분
, stattab => 'mystats'
, statid => 'OLTP'
);
end;
/
--방법2 중지해야함
begin
dems_stats.gather_system_stats(
gathering_mode => 'interval'
--, interval => 720
, stattab => 'mystats'
, statid => 'OLTP'
);
end;
/
--중지
begin
dems_stats.gather_system_stats(
gathering_mode => 'stop'
--, interval => 720
, stattab => 'mystats'
, statid => 'OLTP'
);
end;
/
-- 참고, 이미 운영서버에 적용 중인 통계를 mystats 테이블에 담으려면..
begin
dems_stats.export_system_stats( 'mystats', 'OLTP', USER );
end;
/
-- 3. OS상에서 Exp/Imp 명령어를 이용해 이관
-- 4. 복제한 통게 테이터를 테스터 서버에 적용
begin
dems_stats.import_system_stats( 'mystats', 'OLTP', USER );
end;
/
-- 참고, 운영 서버에 수집된 값을 메모해 아래와 같이 수동으로 설정할 수도 있다. ( 메모 )
begin
dems_stats.set_system_stats( 'CPUSPEED',500 );
dems_stats.set_system_stats( 'SREADTIM',5.0 );
dems_stats.set_system_stats( 'MREADTIM',30.0 );
dems_stats.set_system_stats( 'MBRC',12 );
end;
/
-- 5. Shared Pool 비운다.
-- NoWorkload 수집방법
begin
dbms_stats.gather_system_stats( gathering_mode => 'NOWORKLOAD' );
end;
/
- 강좌 URL : http://www.gurubee.net/lecture/3278
- 구루비 강좌는 개인의 학습용으로만 사용 할 수 있으며, 다른 웹 페이지에 게재할 경우에는 출처를 꼭 밝혀 주시면 고맙겠습니다.~^^
- 구루비 강좌는 서비스 제공을 위한 목적이나, 학원 홍보, 수익을 얻기 위한 용도로 사용 할 수 없습니다.