오라클 성능 고도화 원리와 해법 II (2016년)
통계정보 II 0 0 4,408

by 구루비 통계정보 DBMS_STATS [2017.05.11]


h1.통계정보 II
h3.(1) 전략적인 통계수집 정책의 중요성
h5.CBO 능력을 최대한 끌어 올리는 핵심 요소

  • 정확한 통계정보를 확보하자

h5.DB 관리자의 핵심 역할은 통계정보 관리
통계정보 수집 시 고려사항

  • 시간 : 부하가 없는 시간대에 기능한 빠르게 수집을 완료해야 합
  • 샘플 크기 : 가능한 적은 양의 데이터를 읽어야 함
  • 정확성 : 전수 검사할 때의 통계치에 근접해야 함
  • 안정성 : 데이터에 큰변화가없는데 매번 통계치가 바뀌지 않아야함
    주기적으로 통계 수집하면서 안정적이어야 최적
  • 테이블 정의서에 기록하든 별도 산출물을 이용하든 데이터베이스 설계시 주요 테스크로 진행해야한다.

h3.(2)DBMS_STATS
통계정보 수집을 위해 오랫동안 사용되어온 Analyze 명령어를 버리고 이제는 dbms_stats 패키지를 사용하는 것이 바람직하다.

8-1.jpg
8-2.jpg

h3.(3)컬럼 히스토그램 수집
히스토그램을 가지면 더 나은 실행계획을 수립히는 데 도움이 되지만 이를 수집하고 관리하는 비용이 만만치 않다.

히스토그램이 불필요한경우

  • 컬럼 데이터 분포가균일
  • Unique하고 항상 등치조건으로만 검색되는 컬럼
  • 항상 바인드 변수로 검색되는 컬럼

h3.(4) 데이터 샘플링
샘플링비율 : dbms_stats 패키지에서 샘플링 비율을 조정하기 위해 estimate_percent 인자를 사용(보통5%)
블록단위샘플링 : block_sample 인자를 통해 블록 단위 샘플링을 할지 로우 단위 샘플링을 할지 결정

안정적인 통계정보의 필요성 : 매번 통계치가 다르게 구해질수 있다. (특히 컬럼에 Null 값이 많거나 데이터 분포가 고르지 않을 때) - 통계치는 샘플링 비율에 영향이 크다

해시 기반 알고리즘으로 NDV(the number of distinct values) 계산 - 11g

h3.(5) 파티션 테이블 통계 수집

  • 파티션 레벨 통계 : Static Partition Pruning이 작동할 때 사용
  • 테이블 레벨 통계 : Dynamic Partition Pruning이 작동할 때 사용

dbms_stats 패키지- granularity 옵션

  • global : 테이블 레벨 통계 수집
  • partition : 파티션 레벨 통계 수집
  • subpartition : 서브 파티션 레벨 통계 수집
  • global and partition : 테 이블과 파티션 레벨 통계 수집
  • all : 테이블, 파티션, 서브 파티션 레벨 통계 수집
  • auto: 파티션 유형에 따라 오라클이 결정

통계 정보 생성 GATHER_TABLE_STATS
http://www.gurubee.net/article/23928

h3.(6) 인텍스통계 수집


 begin
   -- 테이블 통계는 estimate mode
    dbms_stats.gather_table_stats ( user , 'T' , cascade =>false, estimate_percent=>10);
   -- 인텍스 통계는 compute mode
    dbms_stats.gather_index_stats( user, 'T_OWNER_IDX' , estimate_percent=>100 );
 end;

h3.(7) 캐싱된 커서 Invalidation
nojnvalidate 옵션

  • false: 통계정보 변경 시 관련된 SQL 커서 들이 즉시 무효화된다.
  • true : 통계정보 변경 시 관련된 SQL 커서 들을 무효화하지 않는다.
  • dbms_stats.autojnvalidate : 통계정보 변경 시 관련된 SQL 커서들을 한꺼번에 무효화하지 않고 정해진 시간(invalidation time window) 동안 조금씩 무효화한다.

h3.(8) 자동통계 수집



select schedule_name, j . program_owner , j.program_name
     , p.program_action, p.number_of_arguments
     , cast (j.last_start_date as timestamp with local time zone) last_start_date
     , last_run_duration , stop_on_window_close
 from dba_scheduler_jobs j , dba_scheduler_programs p
where j.job_name = 'GATHER_STATS_JOB'
  and p. program_name = j.program_name


8-3.jpg

h3.(9) Statistics Preference

"구루비 주주클럽 스터디모임" 에서 2016년에 "오라클 성능 고도화 원리와 해법 II " 도서를 스터디하면서 정리한 내용 입니다.

- 강좌 URL : http://www.gurubee.net/lecture/3355

- 구루비 강좌는 개인의 학습용으로만 사용 할 수 있으며, 다른 웹 페이지에 게재할 경우에는 출처를 꼭 밝혀 주시면 고맙겠습니다.~^^

- 구루비 강좌는 서비스 제공을 위한 목적이나, 학원 홍보, 수익을 얻기 위한 용도로 사용 할 수 없습니다.

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입