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 한다