행위

오라클 통계정보 이동

DB CAFE

Dbcafe (토론 | 기여)님의 2021년 6월 4일 (금) 12:03 판 (데이터베이스)
thumb_up 추천메뉴 바로가기


목차

1 통계정보 수집/추출/입력[편집]

1.1 통계정보수집[편집]

1.1.1 테이블,인덱스포함 통계정보 갱신[편집]

EXEC DBMS_STATS.GATHER_TABLE_STATS('schema_name', 'table_name', method_opt => 'for all indexed columns',cascade => true);
BEGIN
    DBMS_STATS.GATHER_TABLE_STATS(OWNNAME => 'ROWNER',
                                  TABNAME => 'TB_XXXX',
                                  CASCADE => TRUE,
                         ESTIMATE_PERCENT => NULL, 
                               METHOD_OPT =>'FOR ALL COLUMNS SIZE 120');
END;

android method_opt의 값 예시

  1. for all column size 1: 모든 컬럼에 대해 Histogram을 수집하지 않는다.
  2. for all column size auto: Oracle이 Data의 분포를 고려하여 Bucket Size를 계산.(단, 해당 Coloumn이 Predicate로 사용된 적이 있는 경우에만 Histogram 수집)
  3. for all column size skewonly: Oracle이 Data의 분포를 고려하여 Bucket Size를 계산.(단, 해당 Coloumn이 Predicate로 사용된 적이 없어도 Histogram 수집)
  4. for all indexed column size skewonly: Index가 존재하는 모든 컬럼
  5. for all indexed column size auto: Index가 존재하는 모든 컬럼
  6. for columns c1 size 5 c2 size skewonly: 개별 컬럼
  7. for all hidden columns size skewonly: Function Based Index에 의해 생성된 Hidden Cloumn
  8. for columns SYS_NC00003$ size skewonly: Hidden Column 이름을 직접명시


android 모든 컬럼, 모든 Index대상 컬럼, 개별컬럼, Hidden컬럼들에 대해서, Bucket Size를 정할 수 있는 여러가지 옵션(skewonly, auto, 숫자)을 주어 히스토그램을 생성할 수 있다.


1.1.2 테이블 DBMS_STATS.GATHER_TABLE_STATS[편집]

android 파라미터

  • Ownname => 스키마 이름
  • Indname => 인덱스 이름
  • Partname => 파티션 이름
  • Tabname => 테이블 이름
  • Statown => 통계 테이블이 속한 스키마의 이름
  • Stattab => 특정 통계 테이블의 이름
  • Statid => stattab 내의 통계 정보의 ID 설정
  • no_validate => TRUE로 설정할 시 해당 객체를 참조하는 커서의 재 파싱 실행.
  • gather_sys => 'SYS' 유저의 객체에 대해 통계 정보 생성
  • interval => 지정 분 동안의 DB 실시간 SGA 사용량의 의거한 통계 정보 생성. Gathering_mode='INTERVAL' 일 때에만 사용 가능.
  • Degree => 병렬 처리 개수 설정. NULL 시 해당 객체의 생성시에 명시된 DEGREE 값이 적용. DBMS_STATS.DEFAULT_DEGREE 를 사용하여 INIT 파라미터 값 사용 가능.
  • Cascade => 테이블 대상 시에 해당 테이블의 모든 인덱스에 대해서도 통계 정보 생성. 이 때 인덱스 통계 정보는 병렬 사용 불가능.
  • gather_temp => global temporary table에 통계 정보 저장. 해당 테이블은 “on commit ---serve rows” 옵션을 사용해야만 함. 이 테이블에 저장된 통계 정보는 모든 세션들에 대해 공유 가능
  • tblspace => 통계 테이블이 생성될 테이블스페이스의 이름. 지정하지 않을 시에는 실행 유저의 Default 테이블스페이스 사용.


  • 예시 :
EXEC DBMS_STATS.GATHER_TABLE_STATS(ownname=>'스키마명', tabname=>'테이블명', DEGREE => 8);
EXEC DBMS_STATS.GATHER_TABLE_STATS(
  ownname=>'CYKIM'
  , stattab=>'TB_MGR_STATS'
  , tabname=>'TB_DICT'
  , method_opt=>'FOR ALL INDEXED COLUMNS SIZE 74'
  , cascade=>TRUE);

보다자세히

exec DBMS_STATS.GATHER_TABLE_STATS (
  'CYKIM'
,'TB_DICT5'
 , estimate_percent => 100
, method_opt => 'FOR ALL COLUMNS SIZE 1'
 , degree=> 10
, granularity => 'ALL'
, cascade => TRUE
, no_invalidate => FALSE);

1.1.3 파티션테이블[편집]

exec DBMS_STATS.GATHER_TABLE_STATS (
  'CYKIM'
, 'TB_DICT5'
, partname => 'P201102'   -- 파티션명
, estimate_percent => 5
, method_opt => 'FOR ALL COLUMNS SIZE 1'
, degree=> 10
, granularity => 'ALL'
, cascade => TRUE
, no_invalidate => FALSE);

1.1.4 스키마[편집]

EXEC DBMS_STATS.GATHER_SCHEMA_STATS(
      ownname => 'CYKIM'
    , method_opt => 'FOR ALL INDEXED COLUMNS SIZE AUTO'
    , cascade=>TRUE);

1.1.5 인덱스 DBMS_STATS.GATHER_INDEX_STATS[편집]

EXEC DBMS_STATS.GATHER_INDEX_STATS(
'CYKIM'
,'IX_DICT_01');

1.1.6 파티션인덱스[편집]

EXEC DBMS_STATS.GATHER_INDEX_STATS(
ownname => 'CYKIM'
, indname => 'IX_DICT_01'
, partname => 'P20110222');

1.1.7 데이터베이스 DBMS_STATS.GATHER_DATABASE_ STATS[편집]

DBMS_STATS.GATHER_DATABASE_ STATS

1.1.8 시스템통계정보[편집]

DBMS_STATS.GATHER_SYSTEM_STATS

1.1.9 보다 상세한 통계정보[편집]

DBMS_STATS.GENERATE_STATS

1.2 테이블/인덱스 통계정보를 옮기는 방법.[편집]

  • DBMS_STATS.GATHER_TABLE_STATS 패키지 이용

android :1) 통계정보를 임시로 저장할 Table생성.

2) 통계정보 이관할 스키마/테이블 의 통계정보를 임시 table로 이관.
3) 통계정보 백업 테이블 통계 수집
4) 임시 table을 export, 그리고 target db로 import.
5) 임시 Table로 부터 통계치를 대상 테이블에 입력.
6) 통계정보 테이블 삭제



보통, Test 시스템에서 가동 시스템으로 데이타를 이관하는 경우, 데이타 뿐만 아니라 통계정보도 이관하여, Test계와 가동계를 동일하게 유지하고자 하는 경우.

  • 통계정보 추출
    • 테이블 통계 백업 dbms_stats.export_table_stats
    • 스키마 통계 백업 dbms_stats.export_schema_stats
-- 테이블 별 추출 일때
DBMS_STATS.EXPORT_TABLE_STATS(
ownname   VARCHAR2,                -- schema name
tabname   VARCHAR2,                -- table name
partname  VARCHAR2 DEFAULT NULL,   -- partition name
stattab   VARCHAR2,                -- stat table name
statid    VARCHAR2 DEFAULT NULL,   -- optional identifier
cascade   BOOLEAN  DEFAULT TRUE,   -- TRUE = indexes too 
statown   VARCHAR2  DEFAULT NULL); -- stat table schema 

예시) 
EXEC DBMS_STATS.EXPORT_TABLE_STATS(OWNNAME=>'MIG_ADM',TABNAME=>'EMP' ,STATTAB=>'MIG_TAB_STATS_BAK' ,STATOWN=>'MIG_ADM', STATID=>'MIG_20181118', CASCADE=>TRUE) ;

-- 스키마 별 추출 일때
예시) STATS 은 통계 추출 한 임시테이블  
EXEC DBMS_STATS.EXPORT_SCHEMA_STATS (   ownname =>'XX_DBA'				,   stattab => 'STATS',   statid  => '12C_20190514',   statown =>'DBA_cykim');
  • 통계정보 입력
DBMS_STATS.IMPORT_TABLE_STATS(
ownname       VARCHAR2, 
tabname       VARCHAR2,
partname      VARCHAR2 DEFAULT NULL,
stattab       VARCHAR2, 
statid        VARCHAR2 DEFAULT NULL,
cascade       BOOLEAN  DEFAULT TRUE,
statown       VARCHAR2 DEFAULT NULL,
no_invalidate BOOLEAN  DEFAULT to_no_invalidate_type(get_param('NO_INVALIDATE')),
force         BOOLEAN DEFAULT FALSE); 

예시)
EXEC DBMS_STATS.IMPORT_TABLE_STATS(OWNNAME=>'MIG_ADM',TABNAME=>'EMP' ,STATTAB=>'MIG_TAB_STATS_BAK' ,STATOWN=>'MIG_ADM', STATID=>'MIG_20181118', CASCADE=>TRUE) ;
  • 예 : SCOTT의 EMP 통계를 SCOTT2의 EMP2로 이관

1.2.1 통계정보를 임시로 저장할 Table생성.[편집]

EXEC DBMS_STATS.CREATE_STAT_TABLE (
           '스키마명'
          ,'TB_MGR_STATS'
          ,'테이블스페이스명-생략가능'
          );

1.2.2 통계정보 이관할 스키마/테이블 의 통계정보를 임시 table로 이관.[편집]

1.2.2.1 테이블 정보 EXPORT[편집]
  • dbms_stats.export_table_stats ('table_owner', 'table name', null, 'stat table','stat_id',true,'stat table owner');
EXEC DBMS_STATS.EXPORT_TABLE_STATS(
  'CYKIM'         -- 스키마명 
, 'TB_DICT'     -- 테이블명 
, NULL            -- 파티션명 
, 'TB_MGR_STATS'   -- 통계테이블명 
, 'TB_DICT_20161101' -- statid  옵션 식별자(버전)
, TRUE            -- cascade 인덱스포함하여
, 'CYKIM'         -- 소유자명 
) ;
1.2.2.2 스키마 정보 EXPORT[편집]
  • dbms_stats.export_schema_stats ('schema name', 'stat table','stat_id','stat table owner');
EXEC DBMS_STATS.EXPORT_SCHEMA_STATS (
  'CYKIM' -- schema name
 ,'TB_MGR_STATS' -- stat table
 ,'CYKIM_SCHEMA_20160101' -- stat_id(추후 복구용으로 사용할 ID)
 ,'CYKIM' -- stat table owner
);

1.2.3 통계정보 백업 테이블 통계 수집[편집]

EXEC DBMS_STATS.GATHER_TABLE_STATS('MIG_ADM','MIG_TAB_STATS_BAK',DEGREE=>4,GRANULARITY=>'ALL',CASCADE=>TRUE);

1.2.4 임시 table을 export, 그리고 target db로 import.[편집]

$exp scott/tiger tables=STATS file=expstat.dmp
 $imp scott/tiger file=expstat.dmp full=y log=implog.txt
(만약 동일 DB라면 이 과정은 생략 가능합니다.)

1.2.5 임시 Table로 부터 통계치를 원하는 table에 넣는다.[편집]

1.2.5.1 테이블 통계정보 입력[편집]

EXEC DBMS_STATS.IMPORT_TABLE_STATS(
          'CYKIM'     -- 스키마명
        , 'TB_DICT'    -- 테이블명
        , NULL         -- 파티션명 
        , 'TB_MGR_STATS'   -- 통계테이블
           );

1.2.5.2 스키마 정보 입력[편집]

EXEC DBMS_STATS.IMPORT_SCHEMA_STATS (
  'CYKIM' -- schema name
, 'TB_MGR_STATS' -- stat table
, 'CYKIM_TB_MGR_STATS' -- stat_id
, 'CYKIM' -- stat table owner
);

1.3 통계정보 테이블 삭제 시[편집]

EXEC DBMS_STATS.DROP_STAT_TABLE('SCOTT2','STAT_TAB');

1.4 ORA-38029: object statistics are locked 에러 발생시[편집]

exec DBMS_STATS.UNLOCK_TABLE_STATS('OWNER','TABLE명');

1.5 테이블/인덱스 통계정보조회[편집]

1.5.1 해당 스키마에 해당하는 테이블의 통계정보 조회[편집]

SELECT TABLE_NAME, NUM_ROWS, CHAIN_CNT
     , BLOCKS, EMPTY_BLOCKS, AVG_SPACE, AVG_ROW_LEN 
  FROM DBA_TABLES 
 WHERE OWNER = '스키마명';

1.5.2 해당 스키마에 해당하는 인덱스의 통계정보 조회[편집]

SELECT TABLE_NAME, INDEX_NAME, STATUS, NUM_ROWS, LEAF_BLOCKS, BLEVEL 
  FROM DBA_INDEXES 
 WHERE OWNER = '스키마명';

1.6 DBMS_STATS 패키지로 갱신되지 않는 테이블 통계 정보 갱신[편집]

ANALYZE TABLE 스키마명.테이블명 COMPUTE STATISTICS;

1.6.1 DBMS_STATS 패키지로 갱신되지 않는 테이블 통계 정보 갱신(쿼리 생성)[편집]

SELECT 'ANALYZE TABLE 스키마명.' || TABLE_NAME || ' COMPUTE STATISTICS;' 
  FROM DBA_TABLES 
 WHERE OWNER = '스키마명';

1.6.2 DBMS_STATS 패키지로 갱신되지 않는 인덱스 통계정보 갱신[편집]

ANALYZE INDEX 스키마명.인덱스명 VALIDATE STRUCTURE;
SELECT NAME, BLOCKS, LF_ROWS, DEL_LF_ROWS 
  FROM INDEX_STATS;

1.6.2.1 DBMS_STATS 패키지로 갱신되지 않는 인덱스 통계정보 생성[편집]

SELECT 'ANALYZE INDEX 스키마명.' || INDEX_NAME || ' VALIDATE STRUCTURE;' 
  FROM DBA_INDEXES WHERE OWNER = '스키마명';