analyze table emp compute statistics for TABLE;
analyze table emp estimate statistics sample 5000 rows for TABLE;
analyze table emp estimate statistics sample 50 percent for TABLE;
analyze 는 사용중단, dbms_stats 패키지 사용 권고
begin
dbms_stats.gather_table_stats('scott' , 'emp'
, cascade=>false, method_opt=>'for columns' );
end ;
select
TABLE_NAME, NUM_ROWS, BLOCKS, EMPTY_BLOCKS, AVG_SPACE, AVG_ROW_LEN, AVG_SPACE_FREELIST_BLOCKS
, NUM_FREELIST_BLOCKS, SAMPLE_SIZE, LAST_ANALYZED
from dba_tables
where owner='SCOTT'
TABLE_NAME NUM_ROWS BLOCKS EMPTY_BLOCKS AVG_SPACE AVG_ROW_LEN AVG_SPACE_FREELIST_BLOCKS NUM_FREELIST_BLOCKS SAMPLE_SIZE LAST_ANALYZED
------------------------------ ---------------- ------------ ------------------------ ------------------ ---------------------- -------------------------------------------------- -------------------------------------- ---------------------- --------------------------
SALGRADE 5 5 0 0 10 0 0 5 2013/01/18 22:00:13
BONUS 0 0 0 0 0 0 0 0 2013/01/18 22:00:10
EMP 14 5 0 0 38 0 0 14 2017/04/27 17:45:54
DEPT 4 5 0 0 20 0 0 4 2013/01/18 22:00:13
analyze INDEX PK_EMP compute statistics; --인덱스 통계
analyze table scott.emp compute statistics for ALL INDEXES ; --테이블에 속한 모든 인덱스 통계
analyze table scott.emp compute statistics for TABLE for ALL INDEXES ; -- 테이블과 인덱스 통계 동시
begin
dbms_stats.gather_index_stats( ownname => 'scott' , indname => 'PK_EMP' );
end ;
begin
dbms_stats.gather_index_stats( 'scott' , 'emp' , cascade=>true);
end ;
select
INDEX_NAME, BLEVEL, LEAF_BLOCKS, CLUSTERING_FACTOR , NUM_ROWS, DISTINCT_KEYS, AVG_LEAF_BLOCKS_PER_KEY
, AVG_DATA_BLOCKS_PER_KEY, SAMPLE_SIZE, LAST_ANALYZED
from dba_indexes
where owner='SCOTT'
and table_name='EMP'
;
INDEX_NAME BLEVEL LEAF_BLOCKS CLUSTERING_FACTOR NUM_ROWS DISTINCT_KEYS AVG_LEAF_BLOCKS_PER_KEY AVG_DATA_BLOCKS_PER_KEY SAMPLE_SIZE LAST_ANALYZED
------------------------------ ------------ ---------------------- ---------------------------------- ---------------- -------------------------- ---------------------------------------------- ---------------------------------------------- ---------------------- --------------------------
PK_EMP 0 1 1 14 14 1 1 14 2017/04/27 17:53:18
compute statistics 옵션 : 인덱스를 최초 생성하거나 재생성할 때 설정하면 자동으로 인덱스 통계까지 수집
create index emp_name_idx on scott.emp(ename) COMPUTE STATISTICS ;
alter index emp_name_idx rebulid COMPUTE STATISTICS ;
"10g부터는 자동설정 , _optimizer_compute_index_stats --> false 로 설정으로 비활성 "
analyze table scott.emp compute statistics for ALL COLUMNS SIZE 254;
analyze table scott.emp compute statistics for COLUMNS ename SIZE 10, sal SIZE 20;
analyze table scott.emp compute statistics for COLUMNS SIZE 20 ename,sal, hiredate;
"size 옵션은 히스토그램의 최대 버킷 개수를 지정하는 옵션으로서 1부터 254까지 허용(default : 75, disabled : 1 )"
"테이블, 인덱스,컬럼 통계를 아래와 같이 동시에 수집"
analyze table scott.emp compute statistics
for table
for all indexes
for all indexed columns size 254;
*dbms_stats 패키지에 컬럼통계만 따로 수집을 불가능 *
select
COLUMN_NAME, NUM_DISTINCT, LOW_VALUE, HIGH_VALUE, DENSITY, NUM_NULLS, NUM_BUCKETS, LAST_ANALYZED , SAMPLE_SIZE, AVG_COL_LEN , HISTOGRAM
from all_tab_columns
where owner ='SCOTT'
and table_name = 'EMP'
COLUMN_NAME NUM_DISTINCT LOW_VALUE HIGH_VALUE DENSITY NUM_NULLS NUM_BUCKETS LAST_ANALYZED SAMPLE_SIZE AVG_COL_LEN HISTOGRAM
------------------------------ ------------------------ -------------------------------- -------------------------------- -------------- ------------------ ---------------------- -------------------------- ---------------------- ---------------------- ------------------
EMPNO 14 C24A46 C25023 7.1e-002 0 1 2017/04/28 11:30:42 14 3 NONE
ENAME 14 4144414D53 57415244 7.1e-002 0 1 2017/04/28 11:28:37 14 5 NONE
JOB 5 414E414C595354 53414C45534D414E 3.6e-002 0 5 2017/04/28 11:30:42 14 7 FREQUENCY
MGR 6 C24C43 C25003 3.8e-002 1 6 2017/04/28 11:26:51 14 3 FREQUENCY
HIREDATE 13 77B40C11010101 77BB0517010101 3.6e-002 0 13 2017/04/28 11:28:37 14 7 FREQUENCY
SAL 12 C209 C233 3.6e-002 0 12 2017/04/28 11:28:37 14 3 FREQUENCY
COMM 4 80 C20F 0.25 10 1 2017/04/28 11:26:51 14 2 NONE
DEPTNO 3 C10B C11F 3.6e-002 0 3 2017/04/28 11:30:42 14 2 FREQUENCY
"컬럼 히스토그램 조회"
select
ENDPOINT_VALUE, ENDPOINT_NUMBER, ENDPOINT_ACTUAL_VALUE
from dba_histograms
where owner ='SCOTT'
and table_name = 'EMP'
and COLUMN_NAME ='DEPTNO'
order by ENDPOINT_VALUE
ENDPOINT_VALUE ENDPOINT_NUMBER ENDPOINT_ACTUAL_VALUE
---------------------------- ------------------------------ -----------------------------------------------------
10 3
20 8
30 14
Workload 시스템 통계
(1) 실제 애플리케이션에서 발생하는 부하를 측정한 값
(2) Workload 시스템 통계를 제대로 활용하려면 통계 수집 전략 수립
"1.시스템 통계를 담을 테이블(mystats)을 생성"
begin
dbms_stats.create_stat_table(
ownname => USER
, stattab => 'mystats'
, tblspace => 'USERS'
, global_temporary => FALSE
) ;
end;
"2. 시스템 통계를 수집"
"<방법1> 720분 동안 수집하고 자동으로 중지 "
begin
dbms_stats.gather_system_stats(
gathering_mode => 'interval'
, interval => 720
, stattab => 'mystats'
, statid => 'OLTP'
) ;
end;
"<방법2> 정해진 시간이 지난 뒤 통계 수집을 중지 실행"
begin
dbms_stats.gather_system_stats(
gathering_mode => 'start'
, stattab => 'mystats'
, statid => 'OLTP'
) ;
end;
begin
dbms_stats.gather_system_stats(
gathering_mode => 'stop'
, stattab => 'mystats'
, statid => 'OLTP'
) ;
end;
"새로 수집 하지 않고 이미 운영 서버에 적용중인 시스템 통계를 mystats 테이블에 담으려면 아래 명령어를 이용"
begin
dbms_stats.export_system_stats('mystats', 'OLTP', USER ) ;
end;
"3. OS 상에서 Exp/lmp 명령어를 이용해 통계 테이블(mystats)을 테스트 서버로 복제 "
"4.복제한 통계 데 이터 를 테스트 서버에 적용"
begin
dbms_stats.import_system_stats('mystats', 'OLTP', USER ) ;
end;
" 운영 서버에 수집 된 값을 수동으로 설정"
begin
dbms_stats.set_system_stats('CPUSPEED', 500 ) ;
dbms_stats.set_system_stats('SREADTIM', 5.0 ) ;
dbms_stats.set_system_stats('MREADTIM', 30.0 ) ;
dbms_stats.set_system_stats('MBRC', 12 ) ;
end;
"5. 시 스템 통계를 적용하더라도 기존에 캐싱돼 있던 실행계획에는 영향을 미치지 않으므로 Shared Pool을 비운다."
alter system flush shared_pool ;
NoWorkload 시스템 통계
begin
dbms_stats.gather_system_stats( gathering_mode => 'NOWORKLOAD') ;
end;