오라클/Tuning

DBMS_STATS 정리

빵순이^^ 2010. 10. 18. 11:48

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