트러블슈팅 오라클 퍼포먼스 2판 (2017년)
파티셔닝된 오브젝트로 작업하기 0 0 43,186

by 구루비스터디 오브젝트통계 DBMS_STATS [2023.09.09]


파티셔닝된 오브젝트로 작업하기

문제점

  • DBMS_STATS는 파티션 테이블 및 인덱스에 대해 아래의 2가지 방법으로 통계를 수집할 수 있도록 지원한다.
    • 글로벌 통계 : 오브젝트, 파티션, 서브파티션 레벨에 각각 독립적으로 쿼리를 수행하여 통계를 수집한다.(많은 리소스를 사용, 장시간 소요)
    • 파생통계(또는 집계된 통계) : 물리적 레벨에서만 통계를 수집하고, 여기서 수집된 통계를 이용하여 다른레벨 통계를 생성한다.( 적은 리소스 사용, 물리적 레벨만 정확)



-- 서브파티션 레벨에서만 통계를 수집하도록 한다(파생통계)
SQL> BEGIN
  2  	     DBMS_STATS.DELETE_TABLE_STATS(ownname => user,
  3  					   tabname => 't');
  4  	     DBMS_STATS.GATHER_TABLE_STATS(ownname => user,
  5  					   tabname => 't',
  6  					   estimate_percent => 100,
  7  					   granularity => 'subpartition');
  8  END;
  9  /

SQL> SELECT count(DISTINCT sp)
  2  FROM t;

COUNT(DISTINCTSP)
-----------------
	      100

-- 글로벌레벨의 통계가 부정확한 것을 확인 할 수 있다.
SQL> SELECT num_distinct, global_stats
  2  FROM USER_TAB_COL_STATISTICS
  3  WHERE table_name = 'T'
  4  AND column_name = 'SP';

NUM_DISTINCT GLOBAL_STATS
------------ ------------
	  28 NO


-- 파티션 레벨의 통계도 부정확한 것을 확인할 수 있다.
SQL> SELECT num_distinct, global_stats
  2  FROM USER_PART_COL_STATISTICS
  3  WHERE table_name = 'T'
  4  AND partition_name = 'Q1'
  5  AND column_name = 'SP';

NUM_DISTINCT GLOBAL_STATS
------------ ------------
	  28 NO


SQL> SELECT 'Q1_SP1' AS subpartition_name, count(DISTINCT sp) FROM t SUBPARTITION (q1_sp1)
  2  UNION ALL
  3  SELECT 'Q1_SP2', count(DISTINCT sp) FROM t SUBPARTITION (q1_sp2)
  4  UNION ALL
  5  SELECT 'Q1_SP3', count(DISTINCT sp) FROM t SUBPARTITION (q1_sp3)
  6  UNION ALL
  7  SELECT 'Q1_SP4', count(DISTINCT sp) FROM t SUBPARTITION (q1_sp4);

SUBPARTITION_NAME COUNT(DISTINCTSP)
----------------- -----------------
Q1_SP1				 20
Q1_SP2				 28
Q1_SP3				 25
Q1_SP4				 27

-- 파리션 레벨의 통계는 정확한 것을 확인할 수 있다.
SQL> SELECT subpartition_name, num_distinct, global_stats
  2  FROM USER_SUBPART_COL_STATISTICS
  3  WHERE table_name = 'T'
  4  AND column_name = 'SP'
  5  AND subpartition_name LIKE 'Q1%'
  6  ORDER BY subpartition_name;

SUBPARTITION_NAME NUM_DISTINCT GLOBAL_STATS
----------------- ------------ ------------
Q1_SP1			    20 YES
Q1_SP2			    28 YES
Q1_SP3			    25 YES
Q1_SP4			    27 YES


증분통계

  • 글로벌 통계수집 기능은 수집된 오브젝트 통계가 정확하나, 수집하는데 시간과 리소스가 많이 든다.
  • 증분통계의 목적은 오브젝트 통계 수집에 필요한 시간과 리소스를 낮추면서도 동일한 정확도를 제공하는 것이다.
  • 중분 통계를 사용하려면 아래의 조건이 충족되어야 한다.
    • 11.1 버전이상
    • 처리대상 테이블의 incremental 설정값이 True 로 설정 되어야 한다.
    • 처리대상 테이블의 publish 설정값이 True(기본값) 로 설정 되어야 한다.
    • 처리대상 테이블의 estimate_percent 파라미터가 dbms_stat_auto_sample_size (기본값) 로 설정 되어야 한다.
    • sysaux 테이블스페이스에 추가 여유공간이 있어야 한다.


통계 복사하기

  • 파티션이 자주 추가되고, 파티션 내용이 극심하게 변하는 상황에서는 파티션 레벨 통계를 자주 수집해줘야 한다.
  • 이렇게 통계를 자주 수집하게되면 상당한 오버헤드를 발생하게 된다.
  • 이런경우 다른 파티션에서 새롭게 추가된 파티션에 통계를 복사할 수 있다.



DBMS_STATS.COPY_TABLES_STATS(ownname => user,
			tabname => 't',
			srcpartname => 'p_2014_q1',
			dstpartname => 'p_2015_q1',
			scale_factor => 1);

"데이터베이스 스터디모임" 에서 2017년에 "전문가를 위한 트러블슈팅 오라클 퍼포먼스(Second Edition) " 도서를 스터디하면서 정리한 내용 입니다.

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

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

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

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