DBAtlas · 데이터베이스 운영 아틀라스

파티션 테이블의 incremental 통계 구성

Oracle통계

명령어

-- 1) Enable incremental mode (global statistics are derived from partition synopses):
EXEC DBMS_STATS.SET_TABLE_PREFS('CUSTOMER_APP', 'SALE_PART', 'INCREMENTAL', 'TRUE');
EXEC DBMS_STATS.SET_TABLE_PREFS('CUSTOMER_APP', 'SALE_PART', 'INCREMENTAL_STALENESS', 'USE_STALE_PERCENT');
EXEC DBMS_STATS.SET_TABLE_PREFS('CUSTOMER_APP', 'SALE_PART', 'GRANULARITY', 'AUTO');

-- 2) The first gather scans everything and builds synopses; later ones read only changed partitions:
EXEC DBMS_STATS.GATHER_TABLE_STATS(ownname => 'CUSTOMER_APP', tabname => 'SALE_PART');

-- 3) Verify:
SELECT DBMS_STATS.GET_PREFS('INCREMENTAL', 'CUSTOMER_APP', 'SALE_PART') AS incremental FROM dual;
SELECT partition_name, num_rows,
       TO_CHAR(last_analyzed,'YYYY-MM-DD HH24:MI:SS') AS last_analyzed, stale_stats
FROM   dba_tab_statistics
WHERE  owner = 'CUSTOMER_APP' AND table_name = 'SALE_PART'
ORDER  BY partition_position NULLS FIRST;

-- 4) Pre-build synopses on a staging table to be loaded via exchange (12c+):
-- EXEC DBMS_STATS.SET_TABLE_PREFS('CUSTOMER_APP', 'SALE_STAGE', 'INCREMENTAL', 'TRUE');
-- EXEC DBMS_STATS.SET_TABLE_PREFS('CUSTOMER_APP', 'SALE_STAGE', 'INCREMENTAL_LEVEL', 'TABLE');
-- EXEC DBMS_STATS.GATHER_TABLE_STATS('CUSTOMER_APP', 'SALE_STAGE');

하는 일

incremental 모드에서는 파티션별로 synopsis가 저장된다. 전역(테이블 수준) 통계, 특히 NDV는 테이블 전체를 다시 스캔하지 않고 synopsis를 병합해 계산한다. 변경된 파티션만 다시 읽는다.

사용 시점

새 데이터가 최근 파티션에만 들어오는 대형(TB 규모) range/interval 파티션 테이블에서, 전역 통계 수집이 유지보수 시간대를 초과할 때.

주의

자체 라이선스는 없지만 Partitioning 옵션(유료 EE)이 이미 필요하다. synopsis는 SYSAUX 공간을 사용한다(12.2+ HyperLogLog 형식은 훨씬 작다). 첫 수집은 전체 스캔이므로 유지보수 시간대에 시작한다. ESTIMATE_PERCENT를 AUTO_SAMPLE_SIZE 이외의 값으로 설정하면 incremental이 비활성화된다.

DBAtlas에서 열기 →

관련 항목