DBMS_STATS.EXPORT_* 사용법
1) DBMS_STATS.EXPORT_TABLE_STATS << INDEX, SCHEMA, DATABASE, 동일
Exec DBMS_STATS.EXPORT_TABLE_STATS(
ownname => ‘SYS’, << 분석할 테이블 소유자Tabname => ‘employees’, << 스키마 이름Stattab =>’stat_at_5pc’, << 통계정보를 저장할 테이블 이름Statid => 1, << stattab와 연관된 구분자 Cascade => true, << 해당 테이블의 모든 인덱스도 정보 생성Statown => ‘SYS’); << stattab에 지정된 uset stat table 소유자가 다를 경우 지정
2) 이미 생성되어 있는 Object별 통계정보를 Data Dictionary에서 읽어 생성한 stat 테이블에 INSERT
exec dbms_stats.export_table_stats(ownname=>'SCOTT',
s stattab=>'STATS', << 통계정보를 저장할 테이블 이름tabname=>'EMP', << 스키마 이름
DBMS_STATS.IMPORT_* 사용법
1) stattab 테이블에 백업된 이전 통계정보를 다시 시스템(dictionary)에 적용DBMS_STATS.IMPORT_TABLE_STATS << INDEX, SCHEMA, DATABASE, 동일
Exec DBMS_STATS.IMPORT_TABLE_STATS(
ownname => ‘SYS’, << 분석할 테이블 소유자Tabname => ‘employees’, << 스키마 이름Stattab =>’stat_at_5pc’, << 통계정보를 저장한 테이블 이름Statid => 1, << 통계정보를 저장한 테이블 고유 IDStatown => ‘SYS’); << stattab에 지정된 user stat table 소유자가 다를 경우 지정
DBMS_STATS.CREATE_*, DELETE_*, DROP_* 사용 예
통계 테이블 생성
Exec DBMS_STATS.CREATE_STAT_TABLE (
Ownname => cashone, << 스키마 이름 Stattab => cone_stats, << 생성, 혹은 삭제될 테이블의 이름 tblspace => userdata); << 생성할 tablespace 이름,생략 = default tablespace
통계 테이블 삭제
Exec DBMS_STATS.DROP_STAT_TABLE (
ownname => ‘cashone’, << 스키마 이름 stattab => ‘cone_stats’); << 생성, 혹은 삭제될 테이블의 이름
통계정보 삭제
Exec dbms_stats.delete_table_stats
(ownname => 'cashone',
tabname => 'cone_product' ) ;
DBMS_STATS.GATHER_*의 사용 예:
1) SCOTT의 BIG_TABLE 의 전체 테이블과 모드 인덱스를 가지고, 테이블, 칼럼(HIGHAND LOW COLUMN VALUE), 연관 인덱스의 통계정보를 생성한다.( COMPUTE STATISTICS )
EXEC DBMS_STATS.GATHER_TABLE_STATS(OWNNAME => 'SCOTT',
TABNAME => 'BIG_TABLE',
CASCADE => TRUE,
METHOD_OPT => 'FOR ALL COLUMNS SIZE 1');
2) SCOTT의 BIG_TABLE의 15% ROW를 가지고, 테이블, 칼럼, 연관인덱스의 통계정보를 생성한다.( SAMPLE 15 PERCENT )
EXEC DBMS_STATS.GATHER_TABLE_STATS(OWNNAME => 'SCOTT',
TABNAME => 'BIG_TABLE',
CASCADE => TRUE,
ESTIMATE_PERCENT => 15);
3) SCOTT의 BIG_TABLE의 전체 테이블과 모드 인덱스를 가지고, 테이블의 통계정보를 수집하라. 인덱스와 칼럼에 대한 통계정보는 제외
EXEC DBMS_STATS.GATHER_TABLE_STATS(OWNNAME => 'SCOTT',
TABNAME => 'BIG_TABLE',
CASCADE => FALSE,
METHOD_OPT => 'FOR COLUMNS');
4) SCOTT의 BIG_TABLE의 전체 테이블과 모드 인덱스를 가지고, 테이블과 인덱스에 대한 통계정보를 수집하라. 칼럼에 대한 통계정보는 제외
EXEC DBMS_STATS.GATHER_TABLE_STATS(OWNNAME => 'SCOTT',
TABNAME => 'BIG_TABLE',
CASCADE => TRUE,
METHOD_OPT => 'FOR COLUMNS');
5) SCOTT의 BIG_TABLE의 전체 테이블과 모드 인덱스를 가지고, 테이블과 컬럼(NO HISTOGRAM), 그리고 인덱스에 대한 통계정보를 수집하라. 잠시 후에 인덱스 칼럼들의 HISTOGRAM 통계정보를 수집하라.
EXEC DBMS_STATS.GATHER_TABLE_STATS(OWNNAME => 'SCOTT',
TABNAME => 'BIG_TABLE',
CASCADE => TRUE);
잠시 후에..
EXEC DBMS_STATS.GATHER_TABLE_STATS(OWNNAME =>'SCOTT',
TABNAME => 'BIG_TABLE',
CASCADE => TRUE,
METHOD_OPT => 'FOR ALL INDEXED COLUMNSSIZE 1');
6) SCOTT 의 BIG_TABLE 의 전체 테이블과 모드 인덱스를 가지고, 테이블과 인덱스칼럼(ONLY HIGH AND LOW )에 대한 통계정보를 수집하라. 인덱스에 대한 통계정보는수집하지 마라.
EXEC DBMS_STATS.GATHER_TABLE_STATS(OWNNAME => 'SCOTT',
TABNAME => 'BIG_TABLE',
CASCADE => FALSE,
METHOD_OPT => 'FOR ALL INDEXED COLUMNSSIZE 1');
7) 12시간 간격으로 OLTP 시스템 통계 정보 수집
exec DBMS_STATS.GATHER_SYSTEM_STATS (interval => 720,
stattab => 'mystats',
statid => 'OLTP');
8) 테이블 내의 인덱스된 컬럼들 및 대상 테이블과 연관된 모든 인덱스에 대한 통계 정보 생성.
exec DBMS_STATS.GATHER_TABLE_STATS(
schema_name, ‘table_name’,
method_opt => ‘for all indexed columns’,
cascade => true);
9) exec DBMS_STATS.SET_* 사용 예
exec DBMS_STATS.SET_TABLE_STATS
(users, ‘table_name’, numrows => 10000000000, numblks => 1000);
10) 통계정보 생성 이전 통계 정보를 stattab에 statid로 백업 후 시스템에 생성한 통계정보 적용
exec dbms_stats.gather_table_stats(
ownname => 'cashone'
, tabname => 'cone_product'
, estimate_percent => 3 << 통계될 Row의 % 정의 /** 이전 통계 정보를 CREATE_STAT_TABLE을 통해 생성한 테이블에 백업, 3개 모두지정해야함 START */
, stattab => 'cone_stats'
, statid => 'stid_1'
, statown => 'cashone');
/** 이전 통계 정보를 CREATE_STAT_TABLE을 통해 생성한 테이블에 백업, 3개 모두지정해야함 END */
DBMS_STATS.GET_PARAM
1) 인덱스에 대한 통계정보를 수집하게 될 경우에 칼럼 히스토그램이 자동으로 생성 방지exec dbms_stats.set_param ('METHOD_OPT','FOR ALL COLUMNS SIZE 1');
DBMS_STATS.FLUSH_DATABASE_MONITORING_INFO
1) 테이블의 변경사항 수동 Flush 방법
exec DBMS_STATS.FLUSH_DATABASE_MONITORING_INFO;
select * from all_tab_modifications where table_owner=??;
시나리오 1. => 통계정보 생성 --> 백업 --> 복구의 일련과정 예시
-- 통계데이타 초기화 -- 1) 통계정보 백업용 테이블 삭제
begin
DBMS_STATS.DROP_STAT_TABLE (
ownname => 'cashone',
stattab => 'cone_stats'
);
end;
-- 2) 현재 dictionary 통계 정보 삭제
begin
dbms_stats.delete_table_stats(
ownname => 'cashone'
, tabname => 'cone_product');
end;
-- 3) 정보 확인
select * from cone_stats;
select last_analyzed from user_tables where table_name ='CONE_PRODUCT'
-- 통계정보를 저장할 테이블 생성
begin
DBMS_STATS.create_stat_table (
ownname => 'cashone',
stattab => 'cone_stats',
tblspace => 'userdata'
);
end;
--- 최초 통계정보 생성 시스템(dictionary)에 바로 적용 */
begin
dbms_stats.gather_table_stats(
ownname => 'cashone'
, tabname => 'cone_product'
, estimate_percent => 3
) ;
end;
-- 정보 확인 select * from cone_stats; -- 최초 생성한 후라 백업한 내용은 없다. select last_analyzed from user_tables where table_name ='CONE_PRODUCT' -- 적용된 날짜 확인 --- 2번째 통계정보 생성 이전 통계 정보를 stattab에 statid로 백업 후 시스템에 생성한 통계정보 적용.)
begin
dbms_stats.gather_table_stats(
ownname => 'cashone'
, tabname => 'cone_product'
, estimate_percent => 3
/** 이전 통계 정보를 CREATE_STAT_TABLE을 통해 생성한 테이블 에 백업, 3개 모두지정해야함 START */
, stattab => 'cone_stats'
, statid => 'stid_1'
, statown => 'cashone'
/** 이전 통계 정보를 CREATE_STAT_TABLE을 통해 생성한 테이블 에 백업, 3개 모두지정해야함 END */
) ;
end;
-- 생성된 통계정보와 생성일시 확인 : last_analyzed 가 새로 생성한 통계정보 일자로 되어 있음 ---- 정보 확인 select * from cone_stats; -- 백업 된 통계정보 생성일 시 확인 , 날짜를 보면 최초 생성한 내용이 백업 되었음 을 알 수 있다. select last_analyzed from user_tables where table_name ='CONE_PRODUCT' -- 두번째 생성한 최근 적용 날짜를 확인
-- 현재 시스템에 적용된 통계정보 삭제
begin
dbms_stats.delete_table_stats( ownname => 'cashone', tabname => 'cone_product' ) ;
end;
-- stattab 테이블에 백업된 이전 통계정보를 다시 시스템(dictionary)에 적용
begin
DBMS_STATS.IMPORT_TABLE_STATS(
OWNNAME =>'cashone'
,tabname =>'cone_product'
,stattab => 'cone_stats'
,statid => 'STID_1'
,statown =>'cashone');
end;
-- 생성된 통계정보와 생성일시 확인 : --
select * from cone_stats;
select last_analyzed from user_tables where table_name ='CONE_PRODUCT' -- 날짜 확인하면 통계정보 임을 확인 가능.
출처 : http://hwangbokook.com/8
'오라클 > Tuning' 카테고리의 다른 글
다른 User로 Oracle 통계정보 옮기기. (0) | 2010.10.18 |
---|---|
Cardinality 예측 실습 (0) | 2010.08.20 |
Histogram 이란? (1) | 2010.08.20 |
[Oracle Virus] DBMS_XPLAN 패키지에 대한 이해 (0) | 2010.08.18 |
SQL*Plus의 Autotrace 활용 (1) | 2010.08.13 |