오브젝트 통계 수집하기
- GATHER_DATABASE_STATS : 전체 데이터 베이스 통계 수집
- GATHER_DICTIONARY_STATS : 데이터 딕셔너리에 대해 수집
- GATHER_FIXED_OBJECTS_STATS : 데이터 딕셔너리 중 FIXED테이블만 수집
- GATHER_SCHEMA_STATS : 지정된 스키마 전체 통계수집
- GATHER_TABLE_STATS : 하나의 테이블 통계수집
- GATHER_INDEX_STATS : 하나의 인덱스 통계수집
CREATE INDEX, ALTER_INDEX 시에도 자동으로 인덱스가 수집된다.
12.1 버전부터는 CTAS, DIRECT-PATH INSERT시에도 자동으로 통계가 수집된다.
- 오브젝트 통계 수집에 사용되는 프로시저의 파라미터 (교재 313페이지 표 8-3 참조)
대상 오브젝트
- 대상 오브젝트 파라미터는 아래와 같이 어떤 오브젝트에 대한 통계를 수집할지 지정한다.
- ownname : 스키마의 이름 지정(필수)
- indname : 인덱스의 이름 지정(필수)
- tabname : 테이블의 이름 지정(필수)
- partname : 파티션이나 서브파티션의 이름 (지정하지 않으면 전체 파티션 및 서브파티션 통계 수집, 기본값:널)
- comp_id : 구성요소의 ID 지정(기본값 : 널)
- granularity : 파티셔닝된 오브젝트에 대해 어느 레벨까지 통계를 수집할지 지정(기본값 : auto)
- cascade : 인덱스의 처리 여부(기본값 : dbms_stats.auto_cascade)
- gather_fixed : fixed 테이블에 대한 통계 수집여부 지정(기본값 : false)
- gather_sys : sys 스키마의 처리여부 (기본값 : false)
- gather_temp : 임시테이블의 처리여부 ( 기본값 : false)
- options : 어느 오브젝트를 처리할지 지정( 기본값 : gather)
- objlist : options 파라미터의 값에 따라 처리되었거나 처리할 오브젝트 목록 반환
- force : 잠긴 통계를 덮어쓸지 여부지정
- obj_filter_list : 파라미터로 전달한 필터 중 적어도 하나를 충복하는 오브젝트에 대해서만 통계를 수집하도록 지정
스테일(stale) : 통계와 실제 데이터의 불일치가 심해져서 통계정보가 부정확하다라는 의미
오라클 엔진은 기본적으로 데이터가 10%이상 변경되었을 경우 스테일 상태로 판정한다.
수집옵션
- ESTIMATE_PERCENT
- 샘플링을 사용할지 여부 지정(0.000001 ~ 100 사이의 값)
- 100이나 널이면 샘플링을 하지 않음(기본값 : dbms_stats.auto_sample_size)
- 수치가 너무 낮을 경우 실 데이터와 불일치하는 통계가 만들어질 수 있음(엔진에 의해 자동으로 커질 수 있음)
- external 테이블은 샘플링이 되지 않음
- block_sample : 랜덤로우 샘플링(정확함), 블록 샘플링(속도가 빠름) 중 어느것을 사용할지 지정
- method_opt : 컬럼 통계와 히스토그램의 수집여부 및 수집방법 지정
- for all columns size 254 : 모든컬럼에 대해 최대 254개의 버킷을 사용하여 수집
- for all columns size 1 for columns size 254 col1 : 모든컬럼의 통계를 수집하되, col1 컬럼만 254개의 버킷으로 수집한다.
- degree : 통계수집 시 병렬도를 지정한다.(기본값 : 널)
- no_invalidate : 처리된 오브젝트에 의존하는 커서의 무효화를 지정( false로 지정될 경우 모든 커서는 즉시 무효화 된다.)
백업테이블
- stattab : 통계가 저장될 백업테이블 지정
- statid : 오브젝트 통계를 구분하기 위한 식별자
- statown : 지정한 백업테이블의 소유자(기본값 : 널)
DBMS_STATS.CREATE_STAT_TABLE(ownname => user, stattab => 'MYSTATS', tblspace => 'USERS');
DBMS_STATS.UPGRADE_STAT_TABLE(ownname => user, stattab => 'MYSTATS');
- 서로 다른 데이터베이스 버전간에 백업테이블을 이동하려면 백업테이블을 해당버전에 맞게 업그레이드 해줘야한다.
DBMS_STATS.UPGRADE_STAT_TABLE(ownname => user, stattab => 'MYSTATS');
DBMS_STATS.DROP_STAT_TABLE(ownname => user, stattab => 'MYSTATS');