DBMS_STATS 사용

 

 

개요

Oracle8까지는 테이블, 인덱스에 대한 통계정보를 생성하기 위해 ANALYZE 명령만을 사용할 수 있었으나 Oracle8i 부터는 ANALYZE 명령 외에DBMS_STATSPackage를 제공한다.

ANALYZE명령을 사용할 경우에는 신규로 생성한 통계정보가 성능저하를 유발시키더라도 이전과 같은 통계정보를 추출하기 위해서는 다시 ANALYZE 작업을 수행해야 되기 때문에 테이블의 크기가 클 경우 많은 시간을 통계정보를 생성하는데 소비하게 된다.

또한 일부 Partitioned Table에 대해 부정확한 통계정보를 추출할 수도 있기 때문에 Oracle8i부터는DBMS_STATSPackage를 사용하여 통계정보를 생성하고 관리할 것을 권고하고 있다.

DBMS_STATSPackage를 사용할 경우 통계정보에 대한 이력관리가 가능하다.

ANALYZE명령을 사용할 때는 통계정보가 잘못될 경우 다시 ANALYZE작업을 수행해야 했고 이전과 동일한 통계정보를 생성하는 데에도 많은 어려움이 있었다.(테이블 크기가 클수록 문제는 더 심각해 진다)

그러나『DBMS_STATS』Package를 사용하면 문제가 발생하더라도 현재 Data Dictionary에 있는 통계정보를 삭제한 후 User Statistics Table에 저장되어 있는 이전 통계정보를 IMPORT하여 단시간 내에 이전과 동일한 환경으로 돌아가는 것이 가능하다.

 

여기에서는 일반적으로 가장 많이 쓰이는 Procedure에 대한 Syntax 및 사용 예를 설명한다. (자세한 내용은 "Oracle8i supplied PL/SQL Packages Reference" 매뉴얼 참조)

 

 

 

 

CREATE_STAT_TABLE

 

통계정보를 저장할 테이블을 생성한다.

Syntax

DBMS_STATS.CREATE_STAT_TABLE (

Ownname VARCHAR2,

Stattab VARCHAR2,

Tblspace VARCHAR2 DEFAULT NULL);

 

 

Parameter

 

 

Parameter 

Descrition 

Ownname 

Table Owner 

Stattab 

Table Name 

Tblspace 

Tablespace Name 

Example

EXEC DBMS.CREATE_STAT_TABLE('SCOTT','STATSTBL','USERS');

 

 

DROP_STAT_TABLE

통계정보를 저장했던 테이블을 삭제한다.

 

Syntax

 

DBMS_STATS.DROP_STAT_TABLE (

Ownname VARCHAR2,

Stattab VARCHAR2);

Parameter

 

Parameter 

Descrition 

Ownname 

Table Owner 

Stattab 

Table Name 

 

Example

EXEC DBMS.DROP_STAT_TABLE('SCOTT','STATSTBL');

 

 

GATHER_TABLE_STATS

 

테이블, 컬럼에 대한 통계정보를 생성한다. CASCADE parameter에 TRUE를 지정할 경우 인덱스에 대한 통계정보도 생성한다.

 

Syntax

 

DBMS_STATS.GATHER_TABLE_STATS (

ownname VARCHAR2,

tabname VARCHAR2,

partname VARCHAR2 DEFAULT NULL,

estimate_percent NUMBER DEFAULT NULL,

block_sample BOOLEAN DEFAULT FALSE,

method_opt VARCHAR2 DEFAULT 'FOR ALL COLUMNS SIZE 1',

degree NUMBER DEFAULT NULL,

granularity VARCHAR2 DEFAULT 'DEFAULT',

cascade BOOLEAN DEFAULT FALSE,

stattab VARCHAR2 DEFAULT NULL,

statid VARCHAR2 DEFAULT NULL,

statown VARCHAR2 DEFAULT NULL);

 

Parameter

 

Parameter 

Descrition 

Ownname 

Schema of table to analyze 

Tabname 

Table Name 

Partname 

Name of Partition 

Estimate_percent 

Percentage of Rows to estimate 

Block_sample 

Whether or not to use random block sampling instead of random row sampling

Method_opt 

Options used to create histograms. 

Degree 

Degree of parallelism

Granularity

Granularity of statistics to collect ( only pertinet if the table is partitioned ) 

Cascade 

Gather statistics on the indexes for this table.

Stattab

User stat table identifier describing where to save the current statistics.

Statid 

Identifier (optional) to associate with these statistics within stattab.

STATOWN 

STATTAB TABLE OWNER 

 

Example

 

EXEC DBMS_STATS.GATHER_TABLE_STATS( -

OWNNAME=>'SCOTT' -

,TABNAME=>'EMP' -

,PARTNAME=>NULL -

,ESTIMATE_PERCENT=>25 -

,BLOCK_SAMPLE=>TRUE -

,METHOD_OPT=>'FOR ALL COLUMNS SIZE 1' -

,DEGREE=>4 -

,GRANULARITY=>'DEFAULT' -

,CASCADE=>TRUE -

,STATTAB=>'STATSTBL' -

,STATID=>'EMP_011229' -

,STATOWN=>'SCOTT');

 

 

 

 

 

 

 

GATHER_INDEX_STATS

인덱스에 대한 통계정보를 생성한다.

 

Syntax

 

DBMS_STATS.GATHER_INDEX_STATS (

Ownname VARCHAR2,

indname VARCHAR2,

partname VARCHAR2 DEFAULT NULL,

estimate_percent NUMBER DEFAULT NULL,

stattab VARCHAR2 DEFAULT NULL,

statid VARCHAR2 DEFAULT NULL,

statown VARCHAR2 DEFAULT NULL);

 

Parameter

 

Parameter 

Descrition 

Ownname 

Schema of index to analyze 

Indname 

Index Name 

Partname 

Name of Partition 

Estimate_percent 

Percentage of Rows to estimate 

Stattab 

User stat table identifier describing where to save the current statistics.

Statid 

Identifier (optional) to associate with these statistics within stattab.

 

Example

 

EXEC DBMS_STATS.GATHER_INDEX_STATS(ownname=>'scott'

,indname=>'emp'

,partname=>NULL

,stattab=>'STATSTBL'

,estimate_percent=>25

,statid=>'indemp_20010520'

);

 

 

DELETE_TABLE_STATS

테이블, 인덱스에 대한 통계정보를 Data Dictionary 또는 User Statistics Table로 부터 삭제한다. (Default로 테이블에 대한 통계정보를 삭제할 경우 인덱스에 대한 통계정보도 삭제된다)

 

Syntax

 

DBMS_STATS.DELETE_TABLE_STATS (

Ownname VARCHAR2,

Tabname VARCHAR2,

Partname VARCHAR2 DEFAULT NULL,

Stattab VARCHAR2 DEFAULT NULL,

statid VARCHAR2 DEFAULT NULL,

cascade_parts BOOLEAN DEFAULT TRUE,

cascade_columns BOOLEAN DEFAULT TRUE,

cascade_indexes BOOLEAN DEFAULT TRUE,

statown VARCHAR2 DEFAULT NULL);

 

Parameter

 

Parameter 

Descrition 

Ownname 

Schema of index to analyze 

Tabname 

Index Name 

Partname 

Name of Partition 

Stattab 

User stat table identifier describing where to save the current statistics.

Statid 

Identifier (optional) to associate with these statistics within stattab.

 

Example

 

EXEC DBMS_STATS.DELETE_TABLE_STATS(ownname=>'scott'

,tabname=>'emp'

,partname=>NULL

,stattab=>NULL

,statid=>NULL

);

 

 

EXPORT_TABLE_STATS

테이블 및 인덱스에 대한 통계정보를 Data Dictionary로 부터 Export하여 User Statistics Table에 저장한다.

 

Syntax

 

DBMS_STATS.EXPORT_TABLE_STATS (

Ownname VARCHAR2,

Tabname VARCHAR2,

Partname VARCHAR2 DEFAULT NULL,

Stattab VARCHAR2 DEFAULT NULL,

Statid VARCHAR2 DEFAULT NULL,

Cascade BOOLEAN DEFAULT TRUE,

Statown VARCHAR2 DEFAULT NULL);

 

Parameter

 

Parameter 

Descrition 

Ownname 

Schema of index to analyze 

Tabname 

Table Name 

Partname 

Name of Partition 

Stattab 

User stat table identifier describing where to save the current statistics.

Statid 

Identifier (optional) to associate with these statistics within stattab.

Cascade 

If true, then column and index statistics for this table are also exported..

 

Example

 

EXEC DBMS_STATS.EXPORT_TABLE_STATS(ownname=>'scott'

,tabname=>'emp'

,partname=>NULL

,stattab=>'statstab'

,statid=>'emp_20010321'

,cascade=>TRUE

);

 

 

 

 

IMPORT_TABLE_STATS

User Statistics Table에 저장되어 있는 테이블 및 인덱스에 대한 통계정보를 Data Dictionary로 Import한다.

 

Syntax

 

DBMS_STATS.IMPORT_TABLE_STATS (

Ownname VARCHAR2,

Tabname VARCHAR2,

Partname VARCHAR2 DEFAULT NULL,

Stattab VARCHAR2 DEFAULT NULL,

Statid VARCHAR2 DEFAULT NULL,

Cascade BOOLEAN DEFAULT TRUE,

Statown VARCHAR2 DEFAULT NULL);

 

Parameter

 

Parameter 

Descrition 

Ownname 

Schema of index to analyze 

Tabname 

Table Name 

Partname 

Name of Partition 

Stattab 

User stat table identifier describing where to save the current statistics.

Statid 

Identifier (optional) to associate with these statistics within stattab.

Cascade 

If true, then column and index statistics for this table are also exported..

 

Example

 

EXEC DBMS_STATS.IMPORT_TABLE_STATS(ownname=>'scott'

,tabname=>'emp'

,partname=>NULL

,stattab=>'statstab'

,statid=>'emp_20010321'

,cascade=>TRUE

);

 

 

유형별 작업사례

User Statistics Table생성

 

EXEC DBMS_STATS.CREATE_STAT_TABLE('SCOTT','STATSTBL',

'USERS');

 

  • 통계정보를 저장하기 위한 User Statistics Table 생성한다.
  • SCOTT Schema "STATSTBL" 테이블을 생성한다. (Tablespace Name: "USERS")

 

User Statistics Table삭제

 

EXEC DBMS_STATS.DROP_STAT_TABLE('SCOTT','STATSTBL')

 

  • SCOTT Schema에서 "STATSTBL" 테이블을 삭제한다.

 

테이블에 대한 통계정보 생성

EXEC DBMS_STATS.GATHER_TABLE_STATS(ownname=>'scott'

,tabname=>'emp'

,partname=>NULL

,estimate_percent=>25

,method_opt=>

'FOR ALL INDEXED COLUMNS'

,degree=>1

,block_sample=>TRUE

,cascade=>TRUE

,stattab=>'STATSTBL'

,statid=>'emp_20010520'

);

 

  • SCOTT Schema EMP 테이블에 대한 통계정보를 생성한다.(ownname=>'scott', tabname=>'emp')
  • Partition 아닌 전체 테이블에 대한 통계정보를 생성한다.(partname=>NULL)
  • Data Dictionary내에 테이블, 인덱스에 대한 통계정보가 이미 존재하면 새로운 통계정보를 생성하기 전에 stattab파라미터에 지정된 "STATSTBL" 테이블에 이전 통계정보를 저장한다.(stattab=>'STATSTBL')
  • Random Block Sampling 방식이 사용된다.(block_sample=>TRUE, FLASE 사용될 경우 Random Row Sampling 사용된다.)
  • 인덱스에 대한 통계정보도 같이 생성한다.(cascade=>TRUE)
  • 'emp_20010520'라는 Unique ID 사용하여 기존 통계정보를 User Statistics Table저장한다. ID 후에 삭제 또는 Data Dictionary Import시에 사용된다.

 

테이블의 특정 PARTITION 대한 통계정보 생성

 

EXEC DBMS_STATS.GATHER_TABLE_STATS( -

OWNNAME=>'SCOTT' -

,TABNAME=>'EMP' -

,PARTNAME=>NULL -

,ESTIMATE_PERCENT=>25 -

,BLOCK_SAMPLE=>TRUE -

,METHOD_OPT=>'FOR ALL COLUMNS SIZE 1' -

,DEGREE=>4 -

,GRANULARITY=>'DEFAULT' -

,CASCADE=>TRUE -

,STATTAB=>'STATSTBL' -

,STATID=>'EMP_011229' -

,STATOWN=>'SCOTT');

 

  • 전체 테이블이 아닌 "P06" Partition 대한 통계정보를 생성한다.(partname=>'P06')
  • "P06" Partition 대응되는 Local Index Partition 대한 통계정보는 생성하지 않는다.(cascade=>FALSE)

 

 

인덱스에 대한 통계정보 생성

 

EXEC DBMS_STATS.GATHER_INDEX_STATS(ownname=>'scott'

,indname=>'ix_emp'

,partname=>NULL

,estimate_percent=>25

,stattab=>'STATSTBL'

,statid=> 'ix_emp_p06_20010520'

);

 

  • SCOTT Schema IX_EMP 인덱스에 대한 통계정보를 생성한다.(ownname=>'scott', tabname=>'ix_emp')
  • 파티션에 대한 통계정보가 이미 존재하면 새로운 통계정보를 생성하기 전에 stattab파라미터에 지정된 "STATSTBL" 테이블에 이전 통계정보를 저장한다.(stattab=>'STATSTBL')
  • 'ix_emp_p20010520'라는 Unique ID 사용하여 기존 통계정보를 User Statistics Table저장한다. ID 후에 삭제 또는 Data Dictionary Import시에 사용된다.

     

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

 

EXEC DBMS_STATS.DELETE_TABLE_STATS(ownname=>'scott'

,tabname=>'emp'

,partname=>NULL

,stattab=>NULL

,statid=>NULL

);

 

  • SCOTT Schema EMP 테이블에 대한 통계정보를 삭제한다.(ownname=>'scott', tabname=>'emp')
  • Partition 아닌 전체 테이블에 대한 통계정보를 삭제한다.(partname=>NULL)
  • User Statistics Table 아닌 Data Dictionary 부터 통계정보를 삭제한다.(stattab=>NULL) 만약 stattab User Statistics Table 지정할 경우 User Statistics Table에서만 테이블에 대한 통계정보를 삭제한다.
  • Data Dictionary 부터 통계정보를 삭제하기 때문에 statid에는 Default값을 사용한다.

     

테이블에 대한 통계정보 EXPORT

 

EXEC DBMS_STATS.EXPORT_TABLE_STATS(ownname=>'scott'

,tabname=>'emp'

,partname=>NULL

,stattab=>'statstab'

,statid=>'emp_20010321'

,cascade=>TRUE

);

 

  • Data Dictionary SCOTT Schema EMP 테이블에 대한 통계정보를 EXPORT한다.(ownname=>'scott', tabname=>'emp')
  • 특정 Partition 아닌 전체 테이블에 대한 통계정보를 EXPORT한다.(partname=>NULL)
  • EXPORT 통계정보를 "statstab" 테이블에 "emp_20010321"라는 Key값을 가지고 저장한다.(stattab=>'statstab', statid=>'emp_20010321')
  • 인덱스에 대한 통계정보도 같이 EXPORT한다. (cascade=>TRUE)

테이블에 대한 통계정보 IMPORT

 

EXEC DBMS_STATS.IMPORT_TABLE_STATS(ownname=>'scott'

,tabname=>'emp'

,partname=>NULL

,stattab=>'statstab'

,statid=>'emp_20010321'

,cascade=>TRUE

);

 

  • SCOTT Schema EMP 테이블에 대한 통계정보를 IMPORT한다.(ownname=>'scott', tabname=>'emp')
  • "statstab" User Statistics Table "emp_20010321" Key 갖는 통계정보를 IMPORT한다.(stattab=>'statstab', statid=>'emp_20010321')
  • 특정 Partition 아닌 전체 테이블에 대한 통계정보를 IMPORT한다.(partname=>NULL)
  • 인덱스에 대한 통계정보도 같이 IMPORT한다. (cascade=>TRUE)

     

 

참고사항

  • 신규로 작업을 수행하기 전에 현재 ANALYZE 명령을 통해 생성되어 있는 통계정보를 위에서 설명한 EXPORT명령을 사용하여 저장할 것을 권고함.
  • DBMS_STATS Package는 실행 중 내부적으로 다량의 SORT작업이 있으므로 실행하기 전에 다음 명령을 실행하여 RESOURCE를 충분히 할당할 경우 실행시간을 단축시킬 수 있다.

 

ALTER SESSION SET SORT_AREA_SIZE = XXXX;

(byte단위로 값을 지정한다.)

 

  1.  
사업자 정보 표시
(주)블루원 | 김홍태 | 서울특별시 용산구 원효로 4가 135 금홍 2빌딩 | 사업자 등록번호 : 106-86-76684 | TEL : 02-3272-7200 | Mail : support_ora@blueone.co.kr | 통신판매신고번호 : 호 | 사이버몰의 이용약관 바로가기

+ Recent posts