프린트 하기 URL 복사

OS 환경 : Oracle Linux 8.7 (64bit)

 

DB 환경 : Oracle Database 19.27.0.0

 

방법 : 오라클 19c 시스템(Dictionary, Fixed Objects) 통계정보 수집 및 백업, 복구, 이관 방법

이전 게시글에서 일반 오브젝트의 통계를 수집 및 이관하는 방법을 설명했음
참고 : 오라클 19c 통계정보 이관 방법 ( https://positivemh.tistory.com/1265 )
본문에서는 dictionary와 fixed object의 통계를 수집하고 백업, 복구, 이관하는 방법을 설명함

 

 

딕셔너리(Data Dictionary)란?
데이터베이스의 모든 메타데이터를 담고 있는 실제 테이블로
사용자가 create table을 하거나 index를 만들면 그 정보가 TAB$, IND$ 같은 시스템 테이블에 기록됨
이 통계가 없으면 dba_tables 같은 뷰를 조회하거나 쿼리를 파싱할 때 성능이 떨어짐
dba_table에서 owner='SYS'로 조회 했을떄 목록과 통계 정보를 조회할 수 있음

 

 

픽스드 오브젝트(Fixed Objects)란?
오라클 인스턴스가 기동될 때 메모리에 생성되는 내부 구조체임
v$session 같은 뷰를 조회하면 실제로는 메모리 상의 x$kslwt, x$ksuse 등의 테이블을 읽어오는 방식임
디스크에 파일 형태로 존재하지 않고 인스턴스를 재기동하면 메모리 내용은 사라지지만 수집된 통계 정보는 디스크에 영구 보관되어 재기동 후에도 옵티마이저가 참조함
v$fixed_table에서 전체 목록을 확인할 수 있고 dba_tab_statistics에서 object_type = 'FIXED TABLE'로 통계 정보를 조회할 수 있음

 

 

시나리오
현재 통계정보를 확인하고 통계 정보를 백업해둔 뒤, 통계 정보를 새로 수집하고, 다시 백업된 통계정보로 복구해봄

 

 

본문에서 사용하는 프로시저들 설명
DBMS_STATS.GATHER_DICTIONARY_STATS

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
DBMS_STATS.GATHER_DICTIONARY_STATS (
   comp_id           VARCHAR2 DEFAULT NULL,
   estimate_percent  NUMBER DEFAULT 
                          to_estimate_percent_type(GET_PARAM('ESTIMATE_PERCENT')),
   block_sample      BOOLEAN DEFAULT FALSE,
   method_opt        VARCHAR2 DEFAULT GET_PARAM('METHOD_OPT'),
   degree            NUMBER DEFAULT to_degree_type(GET_PARAM('DEGREE')),
   granularity       VARCHAR2 DEFAULT GET_PARAM('GRANULARITY'),
   cascade           BOOLEAN DEFAULT to_cascade_type(GET_PARAM('CASCADE')),
   stattab           VARCHAR2 DEFAULT NULL, 
   statid            VARCHAR2 DEFAULT NULL,
   options           VARCHAR2 DEFAULT 'GATHER AUTO', 
   statown           VARCHAR2 DEFAULT NULL,
   no_invalidate     BOOLEAN DEFAULT
                               to_no_invalidate_type(get_param('NO_INVALIDATE')),
   obj_filter_list   ObjectTab DEFAULT NULL);

변수 설명
comp_id : 분석할 스키마의 컴포넌트 ID임, NULL이면 모든 RDBMS 컴포넌트 스키마를 분석함. (dba_registry 뷰의 comp_id 컬럼 참조) 이 인자 값과 상관없이 sys와 system 스키마는 항상 포함됨
estimate_percent : 통계 수집을 위해 샘플링할 행의 백분율임, 0.000001에서 100 사이를 지정할 수 있음, NULL 입력시 전체 계산을 의미함. dbms_stats.auto_sample_size 사용시 오라클이 최적의 샘플 크기를 결정함(기본값)
block_sample : 행 샘플링 대신 랜덤 블록 샘플링을 사용할지 결정함, 블록 샘플링이 더 효율적이지만, 데이터가 디스크에 무작위로 분산되지 않은 경우 샘플 값이 편향될 수 있음
method_opt : 히스토그램 수집 옵션으로 기본값은 for all columns size auto이고 오라클이 워크로드에 따라 히스토그램 수집 여부를 결정함
degree : 병렬 처리 수준임. NULL은 테이블의 기본값을 사용함을 의미함, dbms_stats.auto_degree를 사용하면 오브젝트 크기에 따라 병렬도를 자동으로 결정함
granularity : 파티션 테이블의 통계 수집 범위를 지정함, auto(기본값), all, global, partition 등을 선택할 수 있음
cascade : 인덱스 통계를 함께 수집할지 여부임, dbms_stats.auto_cascade를 사용하면 오라클이 수집 여부를 결정함(기본값)
stattab : 현재 통계를 저장할 사용자 통계 테이블의 이름임
statid : stattab 내에서 이 통계 데이터를 구분하기 위한 식별자(선택 사항)임
options : 통계 수집 대상 오브젝트를 지정함
- gather auto : (기본값) 통계가 필요한 오브젝트를 오라클이 판단하여 수집함
- gather : 해당 스키마의 모든 오브젝트에 대해 통계를 수집함
- gather stale : 변경 사항이 많은(stale) 오브젝트만 수집함
- gather empty : 통계 정보가 없는 오브젝트만 수집함
statown : stattab이 속한 스키마 이름임(현재 사용자와 다를 경우 지정)
no_invalidate : 통계 수집 시 관련 커서(실행 계획)의 무효화 방식을 제어함
- true : 관련 커서를 무효화하지 않음
- false : 관련 커서를 즉시 무효화함
- dbms_stats.auto_invalidate : (기본값) 오라클이 무효화 시점을 결정하여 성능 영향을 최소화함
obj_filter_list : 특정 조건(필터)을 만족하는 오브젝트들에 대해서만 통계를 수집할 때 사용함, 대소문자를 구분하지 않으며 와일드카드 사용이 가능함

 

 

DBMS_STATS.GATHER_FIXED_OBJECTS_STATS

1
2
3
4
5
6
DBMS_STATS.GATHER_FIXED_OBJECTS_STATS (
   stattab        VARCHAR2 DEFAULT NULL,
   statid         VARCHAR2 DEFAULT NULL,
   statown        VARCHAR2 DEFAULT NULL, 
   no_invalidate  BOOLEAN  DEFAULT to_no_invalidate_type (
                                     get_param('NO_INVALIDATE')));

변수 설명
stattab : 가져올 통계가 저장되어 있는 통계 테이블 이름
statid : stattab 내에서 이 통계를 구분할 수 있는 식별자 (선택 사항)
statown : stattab이 속한 스키마 (현재 스키마와 다를 경우 지정함)
no_invalidate : 통계를 가져올 때 관련 커서의 무효화 방식을 제어함
- TRUE : 관련 커서를 무효화하지 않음
- FALSE : 관련 커서를 즉시 무효화함
- AUTO : 기본값이며, 점진적 무효화를 통해 성능 영향 최소화함(많은 커서가 무효화되는 경우 특히 효과적임)
이 기본값은 SET_DATABASE_PREFS, SET_GLOBAL_PREFS, SET_SCHEMA_PREFS, SET_TABLE_PREFS 프로시저로 변경할 수 있음

 

 

DBMS_STATS.CREATE_STAT_TABLE

1
2
3
4
5
DBMS_STATS.CREATE_STAT_TABLE (
   ownname             VARCHAR2, 
   stattab             VARCHAR2,
   tblspace            VARCHAR2 DEFAULT NULL,
   global_temporary    BOOLEAN DEFAULT FALSE);

변수 설명
ownname : 통계 테이블을 생성할 스키마 이름
stattab : 생성할 통계 테이블 이름임, 이 값은 나중에 EXPORT_*_STATS나 IMPORT_*_STATS 프로시저에서 stattab 파라미터로 사용됨
데이터딕셔너리 통계를 직접 수정하지 않고 내보내거나 가져오기 위해 사용하는 테이블 이름
tblspace : 통계 테이블을 생ㅋ성할 테이블스페이스 이름, 지정하지 않으면 유저의 기본 테이블스페이스에 생성됨
global_temporary : 글로벌 임시 테이블로 생성할지 여부를 지정함
테이블을 글로벌 임시 테이블로 생성해야 하는지 여부

 

 

DBMS_STATS.EXPORT_DICTIONARY_STATS

1
2
3
4
5
DBMS_STATS.EXPORT_DICTIONARY_STATS (
   stattab         VARCHAR2, 
   statid          VARCHAR2 DEFAULT NULL,
   statown         VARCHAR2 DEFAULT NULL,
   stat_category   VARCHAR2 DEFAULT DEFAULT_STAT_CATEGORY);

변수 설명
stattab : 통계를 저장할 사용자 정의 통계 테이블 이름
statid : 통계 그룹 식별자(선택 사항), 이 값으로 stattab 내에서 통계를 구분할 수 있음
statown : stattab이 속한 스키마(현재 스키마와 다를 경우 지정함)
stat_category : 가져올 통계 종류를 지정함, 여러 값을 쉼표로 구분해서 입력 가능
- OBJECT_STATS : 테이블, 컬럼, 인덱스 통계(기본값)
- SYNOPSES : 증분 통계를 위한 synopsis 정보
- OBJECT_STATS, SYNOPSES 지정 시 기존 테이블, 컬럼, 인덱스 통계와 synopsis 모두 삭제됨

 

 

DBMS_STATS.IMPORT_DICTIONARY_STATS

1
2
3
4
5
6
7
8
DBMS_STATS.IMPORT_DICTIONARY_STATS (
   stattab         VARCHAR2, 
   statid          VARCHAR2 DEFAULT NULL,
   statown         VARCHAR2 DEFAULT NULL,
   no_invalidate   BOOLEAN DEFAULT to_no_invalidate_type(
                                    get_param('NO_INVALIDATE')),
   force           BOOLEAN DEFAULT FALSE,
   stat_category   VARCHAR2 DEFAULT DEFAULT_STAT_CATEGORY);

 

 

변수 설명
stattab : 가져올 통계가 저장되어 있는 통계 테이블 이름
statid : stattab 내에서 이 통계를 구분할 수 있는 식별자 (선택 사항)
statown : stattab이 속한 스키마 (현재 스키마와 다를 경우 지정함)
no_invalidate : 통계를 가져올 때 관련 커서의 무효화 방식을 제어함
- TRUE : 관련 커서를 무효화하지 않음
- FALSE : 관련 커서를 즉시 무효화함
- AUTO : 기본값이며, 점진적 무효화를 통해 성능 영향 최소화함(많은 커서가 무효화되는 경우 특히 효과적임)
이 기본값은 SET_DATABASE_PREFS, SET_GLOBAL_PREFS, SET_SCHEMA_PREFS, SET_TABLE_PREFS 프로시저로 변경할 수 있음
force : 통계가 잠겨 있을 경우에도 강제로 가져올지 여부를 지정함
- TRUE : 통계 잠금을 무시하고 통계를 가져옴
- FALSE : 통계가 잠겨 있지 않은 경우에만 가져옴
stat_category : 가져올 통계 종류를 지정함, 여러 값을 쉼표로 구분해서 입력 가능
- OBJECT_STATS : 테이블, 컬럼, 인덱스 통계 (기본값)
- SYNOPSES : 증분 통계를 위한 synopsis 정보

 

 

DBMS_STATS.EXPORT_FIXED_OBJECTS_STATS

1
2
3
4
DBMS_STATS.EXPORT_FIXED_OBJECTS_STATS (
   stattab  VARCHAR2, 
   statid   VARCHAR2 DEFAULT NULL,
   statown  VARCHAR2 DEFAULT NULL);

변수 설명
stattab : 통계를 저장할 사용자 정의 통계 테이블 이름
statid : 통계 그룹 식별자(선택 사항), 이 값으로 stattab 내에서 통계를 구분할 수 있음
statown : stattab이 속한 스키마(현재 스키마와 다를 경우 지정함)

 

 

DBMS_STATS.IMPORT_FIXED_OBJECTS_STATS

1
2
3
4
5
6
7
DBMS_STATS.IMPORT_FIXED_OBJECTS_STATS (
   stattab       VARCHAR2, 
   statid        VARCHAR2 DEFAULT NULL,
   statown       VARCHAR2 DEFAULT NULL,
   no_invalidate BOOLEAN  DEFAULT to_no_invalidate_type(
                                    get_param('NO_INVALIDATE')),
   force         BOOLEAN  DEFAULT FALSE);

변수 설명
stattab : 가져올 통계가 저장되어 있는 통계 테이블 이름
statid : stattab 내에서 이 통계를 구분할 수 있는 식별자 (선택 사항)
statown : stattab이 속한 스키마 (현재 스키마와 다를 경우 지정함)
no_invalidate : 통계를 가져올 때 관련 커서의 무효화 방식을 제어함
- TRUE : 관련 커서를 무효화하지 않음
- FALSE : 관련 커서를 즉시 무효화함
- AUTO : 기본값이며, 점진적 무효화를 통해 성능 영향 최소화함(많은 커서가 무효화되는 경우 특히 효과적임)
이 기본값은 SET_DATABASE_PREFS, SET_GLOBAL_PREFS, SET_SCHEMA_PREFS, SET_TABLE_PREFS 프로시저로 변경할 수 있음
force : 통계가 잠겨 있을 경우에도 강제로 가져올지 여부를 지정함
- TRUE : 통계 잠금을 무시하고 통계를 가져옴
- FALSE : 통계가 잠겨 있지 않은 경우에만 가져옴

 

 

DBMS_STATS.DROP_STAT_TABLE

1
2
3
DBMS_STATS.DROP_STAT_TABLE (
   ownname VARCHAR2, 
   stattab VARCHAR2);

변수 설명
ownname : 스키마 이름
stattab : 사용자 통계 테이블 식별자 (통계를 저장하거나 가져오는 데 사용하는 테이블 이름)

 

 

테스트
현재 통계정보 확인

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
--Dictionary Statistics
SQL>
set lines 200 pages 1000
col owner for a20
col table_name for a30
select * from (
select owner, table_name, to_char(last_analyzed, 'yyyy/mm/dd hh24:mi:ss') last_analyzed 
from dba_tables
where 1=1
and owner = 'SYS'
and table_name not in (select table_name from dba_tab_statistics where object_type = 'FIXED TABLE')
and last_analyzed is not null
order by 3 desc
)
where rownum <= 10;
 
OWNER                TABLE_NAME                     LAST_ANALYZED
-------------------- ------------------------------ -------------------
SYS                  SMON_SCN_TIME                  2026/04/25 22:10:02
SYS                  WRH$_SEG_STAT                  2026/04/25 22:10:02
SYS                  WRH$_MUTEX_SLEEP               2026/04/25 22:10:02
SYS                  WRI$_ADV_ADDM_TODO             2026/04/25 22:10:02
SYS                  STATS_TARGET$                  2026/04/25 22:10:01
SYS                  COL_USAGE$                     2026/04/25 22:10:01
SYS                  WRH$_SEG_STAT_OBJ              2026/04/25 22:10:01
SYS                  WRH$_SQL_WORKAREA_HISTOGRAM    2026/04/25 22:10:01
SYS                  WRI$_ADV_TASKS                 2026/04/25 22:10:01
SYS                  WRI$_OPTSTAT_OPR               2026/04/25 22:10:01
 
10 rows selected.
 
--Fixed Objects Statistics
SQL>
set lines 200 pages 1000
col owner for a20
col table_name for a30
select * from (
select owner, table_name, to_char(last_analyzed, 'yyyy/mm/dd hh24:mi:ss') last_analyzed 
from dba_tab_statistics
where 1=1 
and object_type = 'FIXED TABLE'
and last_analyzed is not null
order by 3 desc
)
where rownum <= 10;
 
OWNER                TABLE_NAME                     LAST_ANALYZED
-------------------- ------------------------------ -------------------
SYS                  X$RPOP_FILESTATS               2026/01/06 22:01:38
SYS                  X$KECUC_CACHE                  2026/01/06 22:01:38
SYS                  X$MMON_AUTOTASK                2026/01/06 22:01:38
SYS                  X$KEWRTBGM                     2026/01/06 22:01:38
SYS                  X$KEWFLINFO                    2026/01/06 22:01:38
SYS                  X$KSXMCOLST                    2026/01/06 22:01:38
SYS                  X$SQL_TESTCASES                2026/01/06 22:01:38
SYS                  X$KCNT                         2026/01/06 22:01:38
SYS                  X$KSNSRESINFO                  2026/01/06 22:01:38
SYS                  X$KSNSOBJ                      2026/01/06 22:01:38
 
10 rows selected.

Dictionary Statistics는 4월 25일, Fixed Objects Statistics는 1월 6일이 최신임

 

 

통계 저장용 테이블 생성

1
2
3
4
5
6
7
8
9
--Dictionary Statistics
SQL> exec dbms_stats.create_stat_table(ownname => 'SYSTEM', stattab => 'DICTIONARY_TABLE_STATS');
 
PL/SQL procedure successfully completed.
 
--Fixed Objects Statistics
SQL> exec dbms_stats.create_stat_table(ownname => 'SYSTEM', stattab => 'FIXED_TABLE_STATS');
 
PL/SQL procedure successfully completed.

 

 

통계정보 수집 전 백업(통계정보 export)

1
2
3
4
5
6
7
8
9
--Dictionary Statistics
SQL> exec dbms_stats.export_dictionary_stats(statown => 'SYSTEM', stattab => 'DICTIONARY_TABLE_STATS', statid => 'DICTIONARY_TABLE_STATS_ID');
 
PL/SQL procedure successfully completed.
 
--Fixed Objects Statistics
SQL> exec dbms_stats.export_fixed_objects_stats(statown => 'SYSTEM', stattab => 'FIXED_TABLE_STATS', statid => 'FIXED_TABLE_STATS_ID');
 
PL/SQL procedure successfully completed.

 

 

각각 테이블 용량 확인

1
2
3
4
5
6
7
8
9
10
11
12
13
14
SQL>
set lines 200 pages 1000
col owner for a10
col segment_name for a30
select owner, segment_name, segment_type, bytes/1024/1024 mb
from dba_segments
where segment_name in ('DICTIONARY_TABLE_STATS', 'FIXED_TABLE_STATS');
 
OWNER      SEGMENT_NAME                   SEGMENT_TYPE               MB
---------- ------------------------------ ------------------ ----------
SYSTEM     DICTIONARY_TABLE_STATS         TABLE                      22
SYSTEM     DICTIONARY_TABLE_STATS         INDEX                      16
SYSTEM     FIXED_TABLE_STATS              TABLE                       4
SYSTEM     FIXED_TABLE_STATS              INDEX                       3

테스트 db에서 대략 각각 22m, 4m 정도의 용량을 차지함, 인덱스는 각각 16m, 3m 용량을 차지함

 

 

통계정보 수집

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
--Dictionary Statistics
SQL>
BEGIN
  DBMS_STATS.GATHER_DICTIONARY_STATS(
    estimate_percent => DBMS_STATS.AUTO_SAMPLE_SIZE,
    method_opt       => 'FOR ALL COLUMNS SIZE SKEWONLY',
    degree           => DBMS_STATS.AUTO_DEGREE,
    cascade          => TRUE
  );
END;
/
 
PL/SQL procedure successfully completed.
 
--Fixed Objects Statistics
SQL> EXEC DBMS_STATS.GATHER_FIXED_OBJECTS_STATS;
 
PL/SQL procedure successfully completed.

파라미터 의미
GATHER_DICTIONARY_STATS
estimate_percent => DBMS_STATS.AUTO_SAMPLE_SIZE : 자동 샘플링, Oracle이 데이터 양과 통계 품질에 따라 적절한 샘플링 비율을 자동 결정
method_opt => 'FOR ALL COLUMNS SIZE SKEWONLY' : Oracle이 컬럼의 데이터 분포를 기반으로 히스토그램을 수집할 컬럼을 결정
degree => DBMS_STATS.AUTO_DEGREE : 병렬 자동 시스템 상황(코어 수, 부하 등)에 따라 Oracle이 병렬도를 자동 설정
cascade => TRUE 인덱스 포함 테이블뿐 아니라 해당 테이블에 속한 인덱스 통계도 함께 수집
GATHER_FIXED_OBJECTS_STATS는 별도로 옵션을 사용하지 않음

 

 

통계정보 재확인

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
--Dictionary Statistics
SQL>
set lines 200 pages 1000
col owner for a20
col table_name for a30
select * from (
select owner, table_name, to_char(last_analyzed, 'yyyy/mm/dd hh24:mi:ss') last_analyzed 
from dba_tables
where 1=1
and owner = 'SYS'
and table_name not in (select table_name from dba_tab_statistics where object_type = 'FIXED TABLE')
and last_analyzed is not null
order by 3 desc
)
where rownum <= 10;
 
OWNER                TABLE_NAME                     LAST_ANALYZED
-------------------- ------------------------------ -------------------
SYS                  WRI$_OPTSTAT_TAB_HISTORY       2026/04/27 19:31:43
SYS                  WRI$_OPTSTAT_OPR               2026/04/27 19:31:42
SYS                  WRI$_OPTSTAT_HISTHEAD_HISTORY  2026/04/27 19:31:40
SYS                  TAB_STATS$                     2026/04/27 19:31:36
SYS                  WRI$_OPTSTAT_HISTGRM_HISTORY   2026/04/27 19:31:36
SYS                  TAB$                           2026/04/27 19:31:35
SYS                  IND$                           2026/04/27 19:31:35
SYS                  HIST_HEAD$                     2026/04/27 19:31:35
SYS                  WRM$_SNAPSHOT                  2026/04/27 19:31:34
SYS                  WRM$_PDB_INSTANCE              2026/04/27 19:31:34
 
10 rows selected.
 
--Fixed Objects Statistics
SQL>
set lines 200 pages 1000
col owner for a20
col table_name for a30
select * from (
select owner, table_name, to_char(last_analyzed, 'yyyy/mm/dd hh24:mi:ss') last_analyzed 
from dba_tab_statistics
where 1=1 
and object_type = 'FIXED TABLE'
and last_analyzed is not null
order by 3 desc
)
where rownum <= 10;
 
OWNER                TABLE_NAME                     LAST_ANALYZED
-------------------- ------------------------------ -------------------
SYS                  X$XS_SESSION_NS_ATTRIBUTES     2026/04/27 19:33:29
SYS                  X$XSOBJECT                     2026/04/27 19:33:29
SYS                  X$XSAGOP                       2026/04/27 19:33:29
SYS                  X$XSSINFO                      2026/04/27 19:33:29
SYS                  X$XSAGGR                       2026/04/27 19:33:29
SYS                  X$XPLTOO                       2026/04/27 19:33:29
SYS                  X$XPLTON                       2026/04/27 19:33:29
SYS                  X$ZASAXTAB                     2026/04/27 19:33:29
SYS                  X$XS_SESSIONS                  2026/04/27 19:33:29
SYS                  X$XS_SESSION_ROLES             2026/04/27 19:33:29
 
10 rows selected.

통계정보가 최신화됨

 

 

통계정보 정보 이전 정보로 복구(통계정보 import)

1
2
3
4
5
6
7
8
9
--Dictionary Statistics
SQL> exec dbms_stats.import_dictionary_stats(statown => 'SYSTEM', stattab => 'DICTIONARY_TABLE_STATS', statid => 'DICTIONARY_TABLE_STATS_ID');
 
PL/SQL procedure successfully completed.
 
--Fixed Objects Statistics
SQL> exec dbms_stats.import_fixed_objects_stats(statown => 'SYSTEM', stattab => 'FIXED_TABLE_STATS', statid => 'FIXED_TABLE_STATS_ID');
 
PL/SQL procedure successfully completed.

 

 

통계정보 재확인

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
--Dictionary Statistics
SQL>
set lines 200 pages 1000
col owner for a20
col table_name for a30
select * from (
select owner, table_name, to_char(last_analyzed, 'yyyy/mm/dd hh24:mi:ss') last_analyzed 
from dba_tables
where 1=1
and owner = 'SYS'
and table_name not in (select table_name from dba_tab_statistics where object_type = 'FIXED TABLE')
and last_analyzed is not null
order by 3 desc
)
where rownum <= 10;
 
OWNER                TABLE_NAME                     LAST_ANALYZED
-------------------- ------------------------------ -------------------
SYS                  SMON_SCN_TIME                  2026/04/26 22:10:02
SYS                  WRH$_SEG_STAT                  2026/04/26 22:10:02
SYS                  WRH$_MUTEX_SLEEP               2026/04/26 22:10:02
SYS                  WRI$_ADV_ADDM_TODO             2026/04/26 22:10:02
SYS                  STATS_TARGET$                  2026/04/26 22:10:01
SYS                  COL_USAGE$                     2026/04/26 22:10:01
SYS                  WRH$_SEG_STAT_OBJ              2026/04/26 22:10:01
SYS                  WRH$_SQL_WORKAREA_HISTOGRAM    2026/04/26 22:10:01
SYS                  WRI$_ADV_TASKS                 2026/04/26 22:10:01
SYS                  WRI$_OPTSTAT_OPR               2026/04/26 22:10:01
 
10 rows selected.
 
--Fixed Objects Statistics
SQL>
set lines 200 pages 1000
col owner for a20
col table_name for a30
select * from (
select owner, table_name, to_char(last_analyzed, 'yyyy/mm/dd hh24:mi:ss') last_analyzed 
from dba_tab_statistics
where 1=1 
and object_type = 'FIXED TABLE'
and last_analyzed is not null
order by 3 desc
)
where rownum <= 10;
 
OWNER                TABLE_NAME                     LAST_ANALYZED
-------------------- ------------------------------ -------------------
SYS                  X$RPOP_FILESTATS               2026/01/06 22:01:38
SYS                  X$KECUC_CACHE                  2026/01/06 22:01:38
SYS                  X$MMON_AUTOTASK                2026/01/06 22:01:38
SYS                  X$KEWRTBGM                     2026/01/06 22:01:38
SYS                  X$KEWFLINFO                    2026/01/06 22:01:38
SYS                  X$KSXMCOLST                    2026/01/06 22:01:38
SYS                  X$SQL_TESTCASES                2026/01/06 22:01:38
SYS                  X$KCNT                         2026/01/06 22:01:38
SYS                  X$KSNSRESINFO                  2026/01/06 22:01:38
SYS                  X$KSNSOBJ                      2026/01/06 22:01:38
 
10 rows selected.

통계정보가 수집하기 전으로 원상복구됨

 

 

만약 통계정보를 export 하여 타 db(clone)에 import 해야한다면
본문 방식에서 export_~_stats 이후 datapump로 expdp를 수행하여 clone db에 impdp 후 통계정보를 import_~_stats 하면됨

 

 

참고용. 통계 복구(통계정보 restore 프로시져)
*이 기능은 10g부터 사용가능한 기능임
현재 복구 가능한 가장 오래된 시점 확인

1
2
3
4
5
SQL> select to_char(dbms_stats.get_stats_history_availability, 'yyyy/mm/dd hh24:mi:ss') get_stats_history_availability from dual;
 
GET_STATS_HISTORY_A
-------------------
2026/03/27 15:44:05

 

 

히스토리 보관 주기(Retention) 확인(단위: 일)

1
2
3
4
5
SQL> select dbms_stats.get_stats_history_retention from dual;
 
GET_STATS_HISTORY_RETENTION
---------------------------
                         31

 

 

히스토리 보관 주기 변경

1
2
3
SQL> exec dbms_stats.alter_stats_history_retention(retention => 60);
 
PL/SQL procedure successfully completed.

 

 

특정 시점으로 딕셔너리 통계 복구(날짜 타입 입력)

1
2
3
SQL> exec dbms_stats.restore_dictionary_stats(as_of_timestamp => to_timestamp('2026/04/27 00:00:00', 'yyyy/mm/dd hh24:mi:ss'));
 
PL/SQL procedure successfully completed.

 

 

특정 시점으로 fixed objects 통계 복구(interval 이용)

1
2
3
SQL> exec dbms_stats.restore_fixed_objects_stats(as_of_timestamp => systimestamp - interval '1' day);
 
PL/SQL procedure successfully completed.

 

 

딕셔너리, 픽스드 오브젝트 외에도 db단위, 스키마, 테이블 단위로도 restore 가능함
restore_database_stats
restore_dictionary_stats
restore_fixed_objects_stats
restore_schema_stats
restore_system_stats
restore_table_stats

 

 

결론 :
시스템 통계정보를 본문에서 설명한 방식을 이용해 백업 및 복구할 수 있음
만약 딕셔너리 조회가 느려 통계를 수집해야할 경우 통계정보를 백업 해두고 수집한 뒤 문제가 발생한 경우 다시 복원하면 안전하게 작업할 수 있음

 

 

참조 : 

How to check dictionary and fixed objects statistics(KB137765)
https://docs.oracle.com/en/database/oracle/oracle-database/19/arpls/DBMS_STATS.html