행위

"오라클 자동 통계정보 스케줄"의 두 판 사이의 차이

DB CAFE

(테이블,인덱스포함 통계정보 갱신)
(테이블,인덱스포함 통계정보 갱신)
220번째 줄: 220번째 줄:
 
</source>
 
</source>
 
{{틀:고지 상자
 
{{틀:고지 상자
|내용= * method_opt의 값 예시
+
|내용='''method_opt의 값 예시'''
 
:for all column size 1: 모든 컬럼에 대해 Histogram을 수집하지 않는다.
 
:for all column size 1: 모든 컬럼에 대해 Histogram을 수집하지 않는다.
 
:for all column size auto: Oracle이 Data의 분포를 고려하여 Bucket Size를 계산.(단, 해당 Coloumn이 Predicate로 사용된 적이 있는 경우에만 Histogram 수집)
 
:for all column size auto: Oracle이 Data의 분포를 고려하여 Bucket Size를 계산.(단, 해당 Coloumn이 Predicate로 사용된 적이 있는 경우에만 Histogram 수집)

2021년 6월 3일 (목) 15:17 판

thumb_up 추천메뉴 바로가기


목차

1 Oracle 통계정보 자동 갱신[편집]

android 통계가 없거나 오래된 테이블/인덱스에 대해서 자동으로 옵티마이저 통계 수집.

  1. 10g 자동통계 job인 GATHER_STATS_JOB 보다 향상 된 기능 제공
  2. 11g Automated Maintenance Tasks Infrastructure(이하 AutoTask)로 통합


  1. AutoTask 에는 3개의 Task가 포함되어 있습니다.
    1. - 옵티마이저 통계 수집 (Automatic Optimizer Statistics Collection)
    2. - 세그먼트 어드바이져 (Automatic Segment Advisor)
    3. - SQL 튜닝 어드바이져 (Automatic SQL Tuning Advisor)

1.1 자동 수행 스케줄 목록 조회[편집]

  1. 요일별 자동 수행 목록
  • DBA_AUTOTASK_WINDOW_CLIENTS
SELECT WINDOW_NAME
     , AUTOTASK_STATUS -- 자동수행 태스크 상태 
     , OPTIMIZER_STATS -- 통계 수집 작업  
     , SEGMENT_ADVISOR -- 디스크 상태 수집 작업
     , SQL_TUNE_ADVISOR -- 튜닝 상태 수집 작업
     , HEALTH_MONITOR  -- 모니터링 
  FROM DBA_AUTOTASK_WINDOW_CLIENTS;

-- AUTOTASK OPERATION
SELECT * 
  FROM DBA_AUTOTASK_OPERATION;

auto optimizer stats collection

1.2 자동 수행 목록[편집]

  • DBA_AUTOTASK_CLIENT
SELECT CLIENT_NAME
     , STATUS
     , MEAN_JOB_DURATION
     , TOTAL_CPU_LAST_7_DAYS
  FROM DBA_AUTOTASK_CLIENT;
  • MEAN_JOB_DURATION은 평균 job 수행시간. not null이라면 한 번이라도 수행된 적이 있다는 것을 의미.
  • TOTAL_CPU_LAST_7_DAYS은 최근 7일동안의 Cumulative CPU time , 이것으로 최근 수행여부를 확인.

1.3 자동 수행 목록 히스토리 조회[편집]

  • DBA_AUTOTASK_CLIENT_HISTORY
SELECT * 
  FROM DBA_AUTOTASK_CLIENT_HISTORY
 ORDER BY WINDOW_START_TIME DESC
;

auto optimizer stats collection

1.4 자동 수행 시작/정지[편집]

--disable Autotask  
exec dbms_auto_task_admin.disable;

--ensable Autotask  
exec dbms_auto_task_admin.enable;

1.5 통계정보만 수집 정지[편집]

BEGIN
  DBMS_AUTO_TASK_ADMIN.DISABLE (  
    client_name  => 'auto optimizer stats collection'
,   operation    => NULL
,   window_name  => NULL 
);
END;

android * OPERATION 과 WINDOW_NAME 둘 다 NULL이면,해당Client는 Disable/Enable 된다.

  • OPERATION이 NULL 이 아니면,WINDOW_NAME은 무시되고 해당 OPERATION은 Disable/Enable 된다.
  • OPERATION이 NULL 이고 WINDOW_NAME이 NULL이 아니면, 해당 Client는 지정한 Window에 한하여 Disable/Enable 된다.


1.6 통계/디스크/튜닝 정보 수집 활성화[편집]

/*
BEGIN
  DBMS_AUTO_TASK_ADMIN.ENABLE (  
    client_name  => 'auto optimizer stats collection'
,   operation    => NULL
,   window_name  => NULL 
);
*/

BEGIN
    -- 1.통계정보 수집 활성화
    dbms_auto_task_admin.enable(client_name => 'auto optimizer stats collection', operation => NULL, window_name => NULL);
    -- 2.디스크 정보 수집 활성화
    dbms_auto_task_admin.enable(client_name => 'auto space advisor', operation => NULL, window_name => NULL);
    -- 3.튜닝 정보 수집 활성화  
    dbms_auto_task_admin.enable(client_name => 'sql tuning advisor', operation => NULL, window_name => NULL);
END;

2 자동 통계정보 수집[편집]

  1. oracle 10g 이상인 경우 parameter 등을 변경하면 통계정보가 자동으로 scheduler에 의해 자동 수집
  2. oracle의 job object중에 gather_stats_job에 의해 통계정보들이 수집.
  3. gather_stats_job은 기존 DATA의 10% 이상의 변경이 있거나, 오랫동안 통계치가 변경되지 않거나, 통계치가 없거나 한 Object 에 대한 Gathering 을 수행.

2.1 자동 통계정보 수집 기능(Automatic Statistics) 대상[편집]

  1. AWR(Automactic Workload Repository) 분석, Self-Tuing 및 일반적인 Tuning 을 목적으로 하는 자료로 특정 시간 동안 DB에서 발생한 여러 가지 상황 정보를 의미 합니다.
  2. Wait Events, Latches, Enqueues, Cpu Consumption, SGA Compoenent, PGA 등에 대한 자료 입니다.
  3. AWR의 정보는 default로 7일 보관 됩니다.
  4. CBO(Cost-Based Optimizer) DB 의 object 즉, application 및 oracle sys 및 system user의 table, index 에 대한 통계정보 수집을 합니다.
  5. 이 수집된 정보는 Optimizer 가 수행계획 수립 시에 의해 사용됩니다.
  6. Optimizer historical 통계정보는 default로31일간 보관됩니다.
  • 자동 통계정보 수집 옵션
statistics_level = {all | typical | basic} 

typical => 전반적인 DB 성능과 관련 통계정보와 DB 자가 관리 기능관련 정보를 수집(기본값)
all => typical + 일정시간 OS 통계정보와 실행 계획 통계를 수집.
basic => 수집을 하지 않음.

2.2 자동 통계정보 수집 변경[편집]

- 통계정보 parameter 확인

$ sqlplus / as sysdba
SQL > show parameter statistics_level
  1. database level 적용
SQL > alter system set statistics_level = 'ALL';
SQL > alter system set statistics_level = 'BASIC';
  1. session level 적용
SQL > alter session set statistics_level = 'ALL';
SQL > alter session set statistics_level = 'BASIC';

2.3 자동 통계정보 수집 확인[편집]

SQL > select job_name, program_name, schedule_name, job_class
from dba_scheduler_jobs
where job_name ='GATHER_ STATS_JOB'

참고) 자동통계정보 수집에서 window의 의미는 수행될 작업에 할당될 시스템 자원에 대한 정보

2.4 자동 통계정보 수집 잡 실행 로그 확인[편집]

SELECT *
  FROM (  SELECT LOG_DATE
               , JOB_NAME
               , STATUS
               , ACTUAL_START_DATE
               , RUN_DURATION
            FROM DBA_SCHEDULER_JOB_RUN_DETAILS
           WHERE JOB_NAME = 'GATHER_STATS_JOB'
        ORDER BY LOG_ID DESC)
 WHERE ROWNUM <= 10;

2.5 자동 통계정보 수집 시 실행되는 program 확인[편집]

select program_action 
  from dba_scheduler_programs 
 where program_name ='GATHER_STATS_PROG'

참고) dba_scheduler_programs 는 DB내의 모든 scheduler program을 확인하는 system view

2.6 자동 통계정보 수집 시 스케줄 확인[편집]

SQL > select * from dba_scheduler_wingroup_members where window_group_name ='MAINTENANCE_WINDOW_GROUP';

참고) dba_scheduler_wingroup_members 는 각각의 time windows 어떻게 정의되어 있는지 확인하는 system view 입니다.

2.7 자동 통계정보 수집 시 스케줄 상세 확인[편집]

SQL> select window_name, repeat_interval, duration
from dba_scheduler_windows
where window_name in ('WEEKNIGHT_WINDOW','WEEKEND_WINDOW');

- 매주 월,화,수,목,금요일은 밤 10시에 8시간 동안 수행. - 토요일 0시에 수행되어 이틀 동안 수행.

2.8 자동 통계정보 수집 중지[편집]

SQL> select job_name, state from dba_scheduler_jobs where job_name ='GATHER_STATS_JOB';
SQL> exec dbms_scheduler.disable('GATHER_STATS_JOB');
SQL> select job_name, state from dba_scheduler_jobs where job_name ='GATHER_STATS_JOB';

2.9 자동 통계정보 수집 재설정[편집]

SQL> exec dbms_scheduler.enable('GATHER_STATS_JOB');
SQL> select job_name, state from dba_scheduler_jobs where job_name ='GATHER_STATS_JOB';


3 스키마,테이블,인덱스 통계정보 갱신[편집]

3.1 스키마안의 모든 세그먼트에 대한 통계정보 갱신[편집]

EXEC DBMS_STATS.GATHER_SCHEMA_STATS('스키마명');

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

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의 값 예시

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



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


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

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

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

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

3.5 테이블의 통계정보 갱신[편집]

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);

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

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

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

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

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

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

3.7 DBMS_STATS 패키지로 갱신되지 않는 인덱스 통계정보 갱신(쿼리 생성)[편집]

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

4 Table 통계정보를 옮기는 방법.[편집]

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

  • 통계정보 추출
-- 테이블 별 추출 일때
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로 이관

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

exec dbms_stats.create_stat_table('SCOTT','STATS');

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

-- 테이블 
exec dbms_stats.export_table_stats('SCOTT','EMP',NULL,'STATS','emp stats',TRUE);
-- 스키마 
EXEC DBMS_STATS.EXPORT_SCHEMA_STATS (   ownname =>'XX_DBA'				,   stattab => 'STATS',   statid  => 'XX_20190514',   statown =>'XX_DBA');
  • 참고 (updated: 2010/08/03)

"emp stats"로 중간에 space가 들어가면 에러발생함

exec dbms_stats.export_table_stats('SCOTT','EMP',NULL,'STATS','EMP_STATS',TRUE,'SCOTT');
BEGIN dbms_stats.export_table_stats('SCOTT','EMP',NULL,'STATS','EMP STATS',TRUE,'SCOTT'); END;
*
ERROR at line 1:
ORA-20001: EMP STATS is an invalid identifier
ORA-06512: at "SYS.DBMS_STATS", line 8240
ORA-06512: at "SYS.DBMS_STATS", line 9188
ORA-06512: at line 1

* 주의 (updated: 2010/08/03)
STATS table의 데이터를 쿼리 해보면 EMP table의 원래 소유자인 SCOTT이 C5 column에 명시되어 있음.
만약 다른 계정으로, 즉 SCOTT2 계정으로 통계정보를 옮기려면 STATS table의 SCOTT값을 SCOTT2로 update 해주어야 함.
두개의 DB의 계정이 동일하다면 변경해 줄 필요 없음

4.3 3) 통계정보 백업 테이블 통계 수집[편집]

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

4.4 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라면 이 과정은 생략 가능합니다.)

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

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

4.6 6) 통계정보 테이블 삭제[편집]

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

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

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