为分区表配置增量统计信息
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');作用
在增量模式下,每个分区存储一个 synopsis;全局(表级)统计信息,尤其是 NDV,通过合并 synopsis 计算,无需重新扫描整个表。只重新读取发生变化的分区。
适用场景
用于大型(TB 级)range/interval 分区表,新数据只落入最近分区,且全局统计信息收集超出维护窗口时。
注意
本身无需许可,但前提是已需要 Partitioning 选件(EE 额外付费)。synopsis 会占用 SYSAUX 空间(12.2+ 的 HyperLogLog 格式小得多)。首次收集为全量扫描;请在维护窗口中开始。将 ESTIMATE_PERCENT 设为 AUTO_SAMPLE_SIZE 以外的任何值都会禁用增量模式。