Programming/Oracle

DBMS_STATS(통계정보)

초록깨비 2022. 5. 18. 16:37
728x90

dbms_stats는 통계정보 이력 관리가 가능하다

 

partitioned table에 대해서 analyze로 통계 정보를 만들 경우 부정확한 통계정보를 추출 할수도 있어

DBMS_STATS package를 사용하여 통계 정보를 사용 할 것을 권고함.

 

DBMS_STATS는 문제가 발생하면 현재 DATA DICTIONARY에 있는 통계 정보를 삭제 후

USER STATISTICS TABLE에 저장되어 있는 이전 통계정보를 IMPORT하여 이전과 동일하게

변경하는 것이 가능함.

 

 

1) 통계정보 테이블 생성

DBMS_STATS.CREATE_STAT_TABLE(table_owner, table_name,  tablespace_name);

   

. TABLESPACE_NAME DEFAULT값 = NULL

. EXEC DBMS_STATS.CREATE_STAT_TABLE(‘SCOTT’,’DEPT’,’USERS’) ;

 

 

2) 통계정보를 저장했던 테이블을 삭제

DBMS_STATS.DROP_STAT_TABLE(table_owner, table_name);

 

. EXEC DBMS_STATS.DROP_STAT_TABLE(‘SCOTT’,’DEPT’);

 

 

3) 통계정보 생성

DBMS_STATS.GATHER_TABLE_STATS(ownname, tabname, partname,

      estimate_percent, block_sample, method_opt, degree, granularity,

      cascade stattab, statid, statown);

 

. EXEC DBMS_STATS.GATHER_TABLE_STATS(ownname=>'scott', tabname=>'dept', 

         partname=>null, estimate_percent=>25, block_sample=>true,

         method_opt=>'for all columns size 1', degree=>4, granularity=>'default',

         cascade=>true, stattab=>'stststbl', statid=>'dept_123', ststown=>'scott'); 

 

        ① partname=>null

               partition이 아닌 전체 테이블에 대한 통계정보를 생성한다

 

        ② stattab=>'stststbl'

               data dictionary내에 테이블,인덱스 통계정보가 이미 존재하면

               새로운 통계정보 생성 전에 statab에 지정된 statstbl 테이블에

               이전 통계정보를 저장한다 

 

        ③ block_sample=>true : random block sampling 방식이 사용됨

                                  false : random row sampling 방식이 사용됨

 

        ④ cascade=>true

                인덱스 통계정보도 생성

 

        ⑤ statid=>'dept_123' 

                 'dept_123' 라는 unique id를 사용하여 통계정보를 user statitics table에 저장한다

                 statid는 삭제 또는 data dictionary로 import시에 사용된다.

 

파라미터 설명 기본값
ownname schema of table alalyze  
tabname table name  
partname partition name null
estimate_percent percentage of rows estimate null
block_sample whether or not to use random block sampling instead of random row sampling false
method_opt option used create histograms for all columns size 1
degree degree of parallelism null
granularity granularity of statistics to collect(only pertinet if the table is partitioned) default
cascade gather statistics on the indexes for this table false
stattab user stat table identifier describing where to save the current statistics null
statid identifier(optional) to associate with these statistics stattab null
statown stattab table owner null

 

 

4) 인덱스 통계정보 생성

DBMS_STATS.GATHER_INDEX_STATS(TABLE_OWNER, INDEX_NAME, PARTNAME,

     ESTIMATE_PERCENT, STATTAB, STATID, STATOWN);

     

. EXEC DBMS_STATS.GATHER_INDEX_STATS(ownname=>’scott’, indname=>’dept’, partname=>NULL,

               stattab=>’STATSTBL’, estimate_percent=>25);

 

 

파라미터 설명 기본값
ownname schema of table alalyze  
indname index name  
partname partition name null
estimate_percent percentage of rows estimate null
stattab user stat table identifier describing where to save the current statistics null
statid identifier(optional) to associate with these statistics stattab null

 

 

5) 테이블, 인덱스에 대한 통계정보(data dictionary or user statistics table)을 삭제

   ( 테이블에 대한 통계정보 삭제시 인덱스에 대한 통계정보도 삭제됨(default)

 

DBMS_STATS.DELETE_TABLE_STATS(ownname, tabname, partname, stattab, statid,

          cascade, cascade_columns, cascade_indexes, statown); 

 

  . EXEC DBMS_STATS.DELETE_TABLE_STATS(ownname=>'scott', tabname=>'dept',

           partname=>null, stattab=null, statid=>null); 

 

          ① partname=>null  

               partition이 아닌 전체 테이블에 대한 통계정보 삭제

 

          ② stattab=null

          ③ statid=>null

파라미터 설명 기본값
ownname schema of table alalyze  
tabname table name  
partname partition name null
stattab user stat table identifier describing where to save the current statistics null
statid identifier(optional) to associate with these statistics stattab null
cascade_parts   true
cascade_columns   true
cascade_indexes   true
statown   null

 

 

6) 통계정보 백업

DBMS_STATS.EXPORT_TABLE_STATS(ownname, tabname, partname, stattab, statid, cascade, statown); 

 

 . EXEC DBMS_STATS.EXPORT_TABLE_STATS(ownname=>'scott', tabname=>'dept', partname=null,

         stattab=>'statstab', statid=>'dept_123', cascade=>true); 

    

        ① statid=>'dept_123'

 

              export한 통계정보를 stattab 테이블에 dept_123 key값으로 저장한다

 

        ② ​cascade=>true

               인덱스 통계정보도 같이 export 한다

 

7) user statistics table에 저장되어 있는 테이블 및 인덱스에 대한 통계정보를 data dictionary로 import

DBMS_STATS.IMPORT_TABLE_STATS(ownname, tabname, partname, stattab, statid, cascade, statown);

 

. EXEC DBMS_STATS.IMPORT_TABLE_STATS(ownname=>'scott', tabname=>'dept', partname=null,

        stattab=>'stattab', statid=>'dept_123', cascade=true);

 

         stattab=>'stattab', statid=>'dept_123'

            stattab user statistics table로 부터 dept_123의 key를 갖는 통계정보를 import한다

 

      ​   cascade=>true

             인덱스 통계정보도 같이 import 한다 ​

728x90