프린트 하기

OS 환경 : Oracle Linux 8.4 (64bit)

 

DB 환경 : Oracle Database 19.3.0.0

 

방법 : 오라클 19c 통계정보 이관 방법

본문에서는 오라클 19c 환경애서 db전체의 테이블, 인덱스 통계정보를 export 하여 타 db(clone)에 넣는 방법을 설명함
본문의 통계정보 이관작업은 아래와 같은 방식으로 수행함
1. create_stat_table 프로시저로 통계정보가 저장될 테이블을 만들고
2. export_database_stats 프로시저로 전체 db 통계정보를 통계정보 저장 테이블에 넣고
3. 이후 datapump expdp를 이용해 해당 테이블을 export 받아서
4. tobe db에서 datapump impdp를 이용해 해당 테이블을 import 한 뒤
5. import_database_stats 프로시저로 통계정보를 db의 오브젝트에 넣어줌
6. drop_stat_table 프로시저로 통계정보가 저장될 테이블을 제거함

 

 

본문에서 사용하는 프로시저들 설명
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_DATABASE_STATS

1
2
3
4
5
DBMS_STATS.EXPORT_DATABASE_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_DATABASE_STATS

1
2
3
4
5
6
7
DBMS_STATS.IMPORT_DATABASE_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.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
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 last_analyzed is not null
order by 3 desc
)
where rownum <= 10;
 
OWNER                TABLE_NAME                     LAST_ANALYZED
-------------------- ------------------------------ -------------------
SYS                  UTL_RECOMP_SORTED              2025/01/22 15:17:11
SYS                  UTL_RECOMP_COMPILED            2025/01/22 15:17:11
DVSYS                RULE_SET$                      2019/04/17 02:03:10
DVSYS                RULE_SET_T$                    2019/04/17 02:03:10
DVSYS                REALM_T$                       2019/04/17 02:03:10
DVSYS                REALM_AUTH$                    2019/04/17 02:03:10
DVSYS                REALM_OBJECT$                  2019/04/17 02:03:10
DVSYS                REALM$                         2019/04/17 02:03:10
DVSYS                RULE_SET_RULE$                 2019/04/17 02:03:10
DVSYS                RULE$                          2019/04/17 02:03:10
 
10 rows selected.

25년 1월에 수집된 통계정보가 제일 최신임

 

 

이 db를 현재 시점기준으로 clone 또는 cold 백업으로 신규 db에 넣는 상황 가정함
db 종료 후 cold 백업 후 추후 통계 import 시점에 restore
참고 : Oracle 12c R2 Clone DB 생성 및 복구 시나리오 ( https://positivemh.tistory.com/268 )

 

 

통계정보 수집(db 레벨 수집)

1
2
3
4
5
6
7
8
9
10
11
12
SQL>
BEGIN
  DBMS_STATS.GATHER_DATABASE_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.

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

 

 

통계 저장용 테이블 생성

1
2
3
SQL> exec dbms_stats.create_stat_table(ownname => 'SYSTEM', stattab => 'ALL_TABLE_STATS');
 
PL/SQL procedure successfully completed.

 

 

all_table_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
SQL> desc system.all_table_stats
 Name         Null?    Type
 --------------------- --------------------------------
 STATID                VARCHAR2(128)
 TYPE                  CHAR(1)
 VERSION               NUMBER
 FLAGS                 NUMBER
 C1                    VARCHAR2(128)
 C2                    VARCHAR2(128)
 C3                    VARCHAR2(128)
 C4                    VARCHAR2(128)
 C5                    VARCHAR2(128)
 C6                    VARCHAR2(128)
 N1                    NUMBER
 N2                    NUMBER
 N3                    NUMBER
 N4                    NUMBER
 N5                    NUMBER
 N6                    NUMBER
 N7                    NUMBER
 N8                    NUMBER
 N9                    NUMBER
 N10                   NUMBER
 N11                   NUMBER
 N12                   NUMBER
 N13                   NUMBER
 D1                    DATE
 T1                    TIMESTAMP(6) WITH TIME ZONE
 R1                    RAW(1000)
 R2                    RAW(1000)
 R3                    RAW(1000)
 CH1                   VARCHAR2(1000)
 CL1                   CLOB
 BL1                   BLOB

 

 

통계정보 export(ALL_TABLE_STATS 테이블로 넣는작업)

1
2
3
SQL> exec dbms_stats.export_database_stats(statown => 'SYSTEM', stattab => 'ALL_TABLE_STATS');
 
PL/SQL procedure successfully completed.

 

 

all_table_stats 테이블 count 확인

1
2
3
4
5
SQL> select count(*) from system.all_table_stats;
 
  COUNT(*)
----------
    188400

약 18만건이 저장됨

 

 

통계테이블 datapump export

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
$ expdp system/oracle \
  dumpfile=202507nn_all_table_stats.dmp \
  logfile=202507nn_all_table_stats.log \
  directory=DATA_PUMP_DIR \
  tables='SYSTEM.ALL_TABLE_STATS'
 
Export: Release 19.0.0.0.0 - Production on Mon Jun 23 21:45:47 2025
Version 19.3.0.0.0
 
Copyright (c) 1982, 2019, Oracle and/or its affiliates.  All rights reserved.
 
Connected to: Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Starting "SYSTEM"."SYS_EXPORT_TABLE_01":  system/******** dumpfile=202507nn_all_table_stats.dmp logfile=202507nn_all_table_stats.log directory=DATA_PUMP_DIR tables=SYSTEM.ALL_TABLE_STATS
Processing object type TABLE_EXPORT/TABLE/TABLE_DATA
Processing object type TABLE_EXPORT/TABLE/INDEX/STATISTICS/INDEX_STATISTICS
Processing object type TABLE_EXPORT/TABLE/STATISTICS/TABLE_STATISTICS
Processing object type TABLE_EXPORT/TABLE/STATISTICS/MARKER
Processing object type TABLE_EXPORT/TABLE/TABLE
Processing object type TABLE_EXPORT/TABLE/INDEX/INDEX
. . exported "SYSTEM"."ALL_TABLE_STATS"                  23.95 MB  188400 rows
Master table "SYSTEM"."SYS_EXPORT_TABLE_01" successfully loaded/unloaded
******************************************************************************
Dump file set for SYSTEM.SYS_EXPORT_TABLE_01 is:
  /ORA19/app/oracle/admin/oracle19/dpdump/202507nn_all_table_stats.dmp
Job "SYSTEM"."SYS_EXPORT_TABLE_01" successfully completed at Mon Jun 23 21:46:07 2025 elapsed 0 00:00:19

 

 

datapump dump 파일 clone db로 복제 또는 콜드백업본 사용중이라면 백업된 경로만 확인

1
2
$ ls /ORA19/app/oracle/admin/oracle19/dpdump/202507nn_all_table_stats.dmp
/ORA19/app/oracle/admin/oracle19/dpdump/202507nn_all_table_stats.dmp

 

 

콜드백업본 restore 또는 clone db 기동

1
2
3
$ cp 콜드백업본_위치/* 데이터파일위치/
SQL> startup
..

 

 

통계테이블 datapump import

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
$ impdp system/"Dhfkzmf1!" \
  dumpfile=202507nn_all_table_stats.dmp \
  logfile=202507nn_all_table_stats_impdp1.log \
  directory=DATA_PUMP_DIR \
  tables='SYSTEM.ALL_TABLE_STATS'
 
Import: Release 19.0.0.0.0 - Production on Mon Jun 23 22:05:27 2025
Version 19.3.0.0.0
 
Copyright (c) 1982, 2019, Oracle and/or its affiliates.  All rights reserved.
 
Connected to: Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Master table "SYSTEM"."SYS_IMPORT_TABLE_01" successfully loaded/unloaded
Starting "SYSTEM"."SYS_IMPORT_TABLE_01":  system/******** dumpfile=202507nn_all_table_stats.dmp logfile=202507nn_all_table_stats_impdp1.log directory=DATA_PUMP_DIR tables=SYSTEM.ALL_TABLE_STATS
Processing object type TABLE_EXPORT/TABLE/TABLE
Processing object type TABLE_EXPORT/TABLE/TABLE_DATA
. . imported "SYSTEM"."ALL_TABLE_STATS"                  23.95 MB  188400 rows
Processing object type TABLE_EXPORT/TABLE/INDEX/INDEX
Processing object type TABLE_EXPORT/TABLE/INDEX/STATISTICS/INDEX_STATISTICS
Processing object type TABLE_EXPORT/TABLE/STATISTICS/TABLE_STATISTICS
Processing object type TABLE_EXPORT/TABLE/STATISTICS/MARKER
Job "SYSTEM"."SYS_IMPORT_TABLE_01" successfully completed at Mon Jun 23 22:05:39 2025 elapsed 0 00:00:11

 

 

통계정보 import(ALL_TABLE_STATS 테이블에서 db 테이블로 통계정보를 넣는작업)

1
2
3
SQL> exec dbms_stats.import_database_stats(statown => 'SYSTEM', stattab => 'ALL_TABLE_STATS');
 
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
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 last_analyzed is not null
order by 3 desc
)
where rownum <= 10;
 
OWNER                TABLE_NAME                     LAST_ANALYZED
-------------------- ------------------------------ -------------------
SYS                  _default_auditing_options_     2025/06/23 21:22:22
SYS                  XSTREAM$_MAP                   2025/06/23 21:22:22
SYS                  XSTREAM$_SERVER_CONNECTION     2025/06/23 21:22:22
SYS                  XSTREAM$_HANDLE_COLLISIONS     2025/06/23 21:22:22
SYS                  XSTREAM$_REPERROR_HANDLER      2025/06/23 21:22:22
SYS                  XSTREAM$_DML_CONFLICT_HANDLER  2025/06/23 21:22:22
SYS                  XSTREAM$_PARAMETERS            2025/06/23 21:22:22
SYS                  XSTREAM$_SYSGEN_OBJS           2025/06/23 21:22:22
SYS                  XSTREAM$_SUBSET_RULES          2025/06/23 21:22:22
SYS                  XSTREAM$_SERVER                2025/06/23 21:22:22
 
10 rows selected.

last_analyzed 값이 null이 아닌값은 모두 잘 들어감

 

 

last_analyzed가 null인 테이블이 있는지 확인

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
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
SQL>
set lines 200 pages 1000
col owner for a20
col table_name for a30
select owner, table_name, to_char(last_analyzed, 'yyyy/mm/dd hh24:mi:ss') last_analyzed from dba_tables
where 1=1
and last_analyzed is null
order by 1, 2;
 
OWNER                TABLE_NAME                     LAST_ANALYZED
-------------------- ------------------------------ -------------------
DBSNMP               MGMT_DB_FILE_GTT
DBSNMP               MGMT_DB_SIZE_GTT
DBSNMP               MGMT_TEMPT_SQL
DVSYS                DV$CMDCONTEXT
GSMADMIN_INTERNAL    CHANGE_LOG_QUEUE_TABLE
GSMADMIN_INTERNAL    CHUNKDATA_TMP
MDSYS                SDO_CS_CONTEXT_INFORMATION
MDSYS                SDO_GEOR_DDL__TABLE$$
MDSYS                SDO_GR_MOSAIC_0
MDSYS                SDO_GR_MOSAIC_1
MDSYS                SDO_GR_MOSAIC_2
MDSYS                SDO_GR_MOSAIC_3
MDSYS                SDO_GR_MOSAIC_CB
MDSYS                SDO_GR_PARALLEL
MDSYS                SDO_GR_RDT_1
MDSYS                SDO_ST_TOLERANCE
MDSYS                SDO_TOPO_DATA$
MDSYS                SDO_TOPO_MAPS
MDSYS                SDO_TOPO_RELATION_DATA
MDSYS                SDO_TOPO_TRANSACT_DATA
MDSYS                SDO_TXN_IDX_EXP_UPD_RGN
MDSYS                SDO_TXN_JOURNAL_GTT
MDSYS                SDO_WFS_LOCAL_TXNS
ORDDATA              ORDDCM_ANON_ATTRS_TMP
ORDDATA              ORDDCM_ANON_RULES_TMP
ORDDATA              ORDDCM_CT_ACTION_TMP
ORDDATA              ORDDCM_CT_DAREFS_TMP
ORDDATA              ORDDCM_CT_LOCATORPATHS_TMP
ORDDATA              ORDDCM_CT_PRED_OPRD_TMP
ORDDATA              ORDDCM_CT_PRED_PAR_TMP
ORDDATA              ORDDCM_CT_PRED_SET_TMP
ORDDATA              ORDDCM_CT_PRED_TMP
ORDDATA              ORDDCM_DICT_ATTRS_TMP
ORDDATA              ORDDCM_DOCS_TMP
ORDDATA              ORDDCM_DOC_REFS_TMP
ORDDATA              ORDDCM_MAPPED_PATHS_TMP
ORDDATA              ORDDCM_MAPPING_DOCS_TMP
ORDDATA              ORDDCM_PRV_ATTRS_TMP
ORDDATA              ORDDCM_RT_PREF_PARAMS_TMP
ORDDATA              ORDDCM_STD_ATTRS_TMP
ORDDATA              ORDDCM_STORED_TAGS_TMP
ORDDATA              ORDDCM_UID_DEFS_TMP
SYS                  ALERT_QT
SYS                  AQ$_KUPC$DATAPUMP_QUETAB_1_D
SYS                  AQ$_KUPC$DATAPUMP_QUETAB_1_G
SYS                  AQ$_KUPC$DATAPUMP_QUETAB_1_H
SYS                  AQ$_KUPC$DATAPUMP_QUETAB_1_I
SYS                  AQ$_KUPC$DATAPUMP_QUETAB_1_L
SYS                  AQ$_KUPC$DATAPUMP_QUETAB_1_P
SYS                  AQ$_KUPC$DATAPUMP_QUETAB_1_S
SYS                  AQ$_KUPC$DATAPUMP_QUETAB_1_T
SYS                  AQ$_MEM_MC
SYS                  AQ_EVENT_TABLE
SYS                  AQ_PROP_TABLE
SYS                  ATEMPTAB$
SYS                  CHNF$_QUERY_DELTAS
SYS                  CLUSTER_DATABASES
SYS                  CLUSTER_INSTANCES
SYS                  CLUSTER_NODES
SYS                  CQN_EVENT_TABLE
SYS                  DATA_PUMP_XPL_TABLE$
SYS                  DBMS_STATS_ID_MAP_TAB
SYS                  DBMS_STATS_OBJ_LIST_TAB
SYS                  EDITIONING_TYPES$
SYS                  FINALHIST$
SYS                  IMPDP_STATS
SYS                  KU$NOEXP_TAB
SYS                  KU$XKTFBUE
SYS                  KU$_DATAPUMP_MASTER_10_1
SYS                  KU$_DATAPUMP_MASTER_11_1
SYS                  KU$_DATAPUMP_MASTER_11_1_0_7
SYS                  KU$_DATAPUMP_MASTER_11_2
SYS                  KU$_DATAPUMP_MASTER_12_0
SYS                  KU$_DATAPUMP_MASTER_12_2
SYS                  KU$_LIST_FILTER_TEMP
SYS                  KU$_LIST_FILTER_TEMP_2
SYS                  KU$_SHARD_DOMIDX_NAMEMAP
SYS                  KUPC$DATAPUMP_QUETAB_1
SYS                  MAP_OBJECT
SYS                  MODELGTTRAW$
SYS                  ODCI_PMO_ROWIDS$
SYS                  ODCI_SECOBJ$
SYS                  ODCI_WARNINGS$
SYS                  ORA$PREPLUGIN_BACKUP_QTB
SYS                  PDB_MON_EVENT_QTABLE$
SYS                  PLAN_TABLE$
SYS                  PSTUBTBL
SYS                  SAM_SPARSITY_ADVICE
SYS                  SCHEDULER$_EVENT_QTAB
SYS                  SCHEDULER$_REMDB_JOBQTAB
SYS                  SCHEDULER_FILEWATCHER_QT
SYS                  SNAP_XCMT$
SYS                  SPD_SCRATCH_TAB
SYS                  STATS_ADVISOR_FILTER_OBJ$
SYS                  STATS_ADVISOR_FILTER_OPR$
SYS                  STATS_ADVISOR_FILTER_RULE$
SYS                  STREAMS$_COMPONENT_EVENT_IN
SYS                  STREAMS$_COMPONENT_IN
SYS                  STREAMS$_COMPONENT_LINK_IN
SYS                  STREAMS$_COMPONENT_PROP_IN
SYS                  STREAMS$_COMPONENT_STAT_IN
SYS                  STREAMS$_COMPONENT_STAT_OUT
SYS                  STREAMS$_LOCAL_ACTIONS_IN
SYS                  STREAMS$_LOCAL_FINDINGS_IN
SYS                  STREAMS$_LOCAL_RECS_IN
SYS                  STREAMS$_PATH_BOTTLENECK_OUT
SYS                  STREAMS$_PATH_STAT_OUT
SYS                  SUMDELTA$
SYS                  SYS$SERVICE_METRICS_TAB
SYS                  SYS_IOT_OVER_73248
SYS                  SYS_IOT_OVER_73293
SYS                  SYS_MFBA_NCHANGE
SYS                  SYS_MFBA_NROW
SYS                  SYS_MFBA_NTCRV
SYS                  SYS_MFBA_STAGE_RID
SYS                  SYS_MFBA_TRACKED_TXN
SYS                  TTS_ERROR$
SYS                  WRI$_ADV_ADDM_PDBS
SYS                  WRI$_ADV_ASA_RECO_DATA
SYS                  WRI$_HEATMAP_TOPN_DEP1
SYS                  WRI$_HEATMAP_TOPN_DEP2
SYS                  WRI$_SQLSET_PLANS_TOCAP
SYS                  WRI$_SQLSET_STS_TOPACK
SYS                  XS$VALIDATION_TABLE
SYSTEM               ALL_TABLE_STATS
SYSTEM               LOGMNRT_MDDL$
SYSTEM               LOGMNR_GT_TAB_INCLUDE$
SYSTEM               LOGMNR_GT_USER_INCLUDE$
SYSTEM               LOGMNR_GT_XID_INCLUDE$
SYSTEM               OL$
SYSTEM               OL$HINTS
SYSTEM               OL$NODES
WMSYS                WM$EVENT_QUEUE_TABLE
WMSYS                WM$MW_TABLE$
XDB                  XDB$XIDX_IMP_T
 
135 rows selected.

135개정도 있지만 모두 오라클 기본 유저들이라 무시해도 될듯함

 

 

작업 완료 후 통계 저장용 테이블 삭제

1
2
3
SQL> exec dbms_stats.drop_stat_table(ownname => 'SYSTEM',stattab => 'ALL_TABLE_STATS');
 
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
SQL> 
set lines 200 pages 1000
col operation for a20
col target for a40
col status for a10
col job_name for a20
select operation, target
, to_char(start_time, 'yyyy/mm/dd hh24:mi:ss') st_time
, to_char(end_time, 'yyyy/mm/dd hh24:mi:ss') end_time
, status, job_name, session_id
from dba_optstat_operations;
 
OPERATION            TARGET                                   ST_TIME             END_TIME            STATUS     JOB_NAME             SESSION_ID
-------------------- ---------------------------------------- ------------------- ------------------- ---------- -------------------- ----------
gather_index_stats   "SYS"."WRI$_ADV_REC_PK"                  2025/06/24 22:00:25 2025/06/24 22:00:25 COMPLETED  ORA$AT_OS_OPT_SY_21         149
gather_index_stats   "SYS"."WRI$_ADV_SQLT_RTN_PLAN_PK"        2025/06/24 22:00:25 2025/06/24 22:00:25 COMPLETED  ORA$AT_OS_OPT_SY_21         149
gather_index_stats   "SYS"."WRI$_ADV_ACTIONS_PK"              2025/06/24 22:00:25 2025/06/24 22:00:25 COMPLETED  ORA$AT_OS_OPT_SY_21         149
gather_index_stats   "SYS"."WRI$_ADV_REC_ACTIONS_PK"          2025/06/24 22:00:25 2025/06/24 22:00:25 COMPLETED  ORA$AT_OS_OPT_SY_21         149
lock_table_stats     "IMSI"."TBL_LOCK"                        2025/06/26 12:47:47 2025/06/26 12:47:47 COMPLETED                              393
unlock_table_stats   "IMSI"."TBL_LOCK"                        2025/06/26 13:17:06 2025/06/26 13:17:06 COMPLETED                              393
lock_schema_stats    IMSI                                     2025/06/26 13:19:58 2025/06/26 13:19:58 COMPLETED                              393
unlock_table_stats   "IMSI"."TBL_LOCK"                        2025/06/26 13:21:34 2025/06/26 13:21:34 COMPLETED                              393
gather_table_stats   "IMSI"."TEST1"                           2025/06/26 13:23:31 2025/06/26 13:23:31 COMPLETED                              393
lock_schema_stats    IMSI                                     2025/06/26 13:23:50 2025/06/26 13:23:50 COMPLETED                              393
gather_table_stats   "IMSI"."TEST1"                           2025/06/26 13:23:53 2025/06/26 13:23:53 FAILED                                 393
lock_schema_stats    IMSI                                     2025/06/26 13:24:34 2025/06/26 13:24:34 COMPLETED                              393
unlock_table_stats   "IMSI"."TBL_LOCK"                        2025/06/26 13:25:14 2025/06/26 13:25:14 COMPLETED                              393
unlock_schema_stats  IMSI                                     2025/06/26 13:25:24 2025/06/26 13:25:24 COMPLETED                              393
lock_schema_stats    IMSI                                     2025/06/26 13:25:39 2025/06/26 13:25:39 COMPLETED                              393
gather_table_stats   "IMSI"."TEST1"                           2025/06/26 13:43:10 2025/06/26 13:43:10 COMPLETED                              393
gather_table_stats   "IMSI"."TBL_LOCK"                        2025/06/26 13:43:24 2025/06/26 13:43:24 FAILED                                 393
 
1185 rows selected.

 

 

failed 인 대상은 notes 컬럼을 보면 실패 원인을 확인할 수 있음

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
SQL> 
set lines 200 pages 1000
col status for a10
select id, status, notes
from dba_optstat_operations
where id = 1527;
 
        ID STATUS
---------- ----------
NOTES
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
      1527 FAILED
<params><param name="block_sample" val="FALSE"/><param name="cascade" val="NULL"/><param name="concurrent" val="FALSE"/><param name="degree" val="NULL"/><param name="estimate_percent" val="DBMS_STATS.
AUTO_SAMPLE_SIZE"/><param name="force" val="FALSE"/><param name="granularity" val="AUTO"/><param name="method_opt" val="FOR ALL COLUMNS SIZE AUTO"/><param name="no_invalidate" val="NULL"/><param name=
"ownname" val="IMSI"/><param name="partname" val=""/><param name="reporting_mode" val="FALSE"/><param name="statid" val=""/><param name="statown" val=""/><param name="stattab" val=""/><param name="sta
ttype" val="DATA"/><param name="tabname" val="TBL_LOCK"/></params><error>ORA-20005: object statistics are locked (stattype = ALL)</error>

 

 

note 재정렬

1
2
3
4
5
6
7
8
9
10
<params><param name="block_sample" val="FALSE"/><param name="cascade" val="NULL"/>
<param name="concurrent" val="FALSE"/><param name="degree" val="NULL"/>
<param name="estimate_percent" val="DBMS_STATS.AUTO_SAMPLE_SIZE"/>
<param name="force" val="FALSE"/><param name="granularity" val="AUTO"/>
<param name="method_opt" val="FOR ALL COLUMNS SIZE AUTO"/><param name="no_invalidate" val="NULL"/>
<param name="ownname" val="IMSI"/><param name="partname" val=""/>
<param name="reporting_mode" val="FALSE"/>
<param name="statid" val=""/><param name="statown" val=""/>
<param name="stattab" val=""/><param name="stattype" val="DATA"/><param name="tabname" val="TBL_LOCK"/>
</params><error>ORA-20005: object statistics are locked (stattype = ALL)</error>

error 부분를 보면 ORA-20005: object statistics are locked (stattype = ALL) 이라고 나와있음
이는 테이블에 통계정보 lock이 걸려 있어 수집을 못한것임
에러 이외에도 notes 컬럼을 보면 통계정보 수집시 어떤 옵션을 사용했는지 확인도 가능함

 

 

결론 :
dbms_stats 패키지를 이용해 db 전체 통계정보를 백업 한뒤 다시 복구할수 있음
이 방식은 마이그레이션 프로젝트시 1차로 이관해놓은 데이터에 대해서 통계정보를 전체 수집한 뒤
실 이관 및 오픈을 하기 직전에 통계정보를 재수집하면 너무 느리기때문에 백업해둔 통계정보를 임포트하는 용도로 사용할수 있음

 

 

참조 : 

How To Transfer Statistics To Different Schemas and Tables and Indexes and Partition and Columns (Doc ID 2701368.1)
How to Use DBMS_STATS to Move Statistics to a Different Database (Doc ID 117203.1)
Transferring Optimizer Statistics to Support (Doc ID 242489.1)
ORA-20001 While Importing Database Statistics From 12.1.0.2 NON-CDB To 19c PDB (Doc ID 2832259.1)
https://dohdatabase.com/2023/12/18/how-to-export-and-import-statistics-faster-using-dbms_stats-in-parallel/
https://bae9086.tistory.com/515#google_vignette
https://docs.oracle.com/en/database/oracle/oracle-database/19/arpls/DBMS_STATS.html#GUID-A323DD4F-1A05-4247-BEC6-1A7103660DAF
https://docs.oracle.com/en/database/oracle/oracle-database/19/arpls/DBMS_STATS.html#GUID-CE0A8C67-2EC6-422F-A311-16083A07110D
https://docs.oracle.com/en/database/oracle/oracle-database/19/arpls/DBMS_STATS.html#GUID-0244C71F-40E4-4CC5-A1D3-08C96B8B9E16
https://docs.oracle.com/en/database/oracle/oracle-database/19/refrn/ALL_TAB_STATISTICS.html
https://positivemh.tistory.com/332