DBAtlas · 数据库运维图谱

为分区表配置增量统计信息

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 以外的任何值都会禁用增量模式。

在 DBAtlas 中打开 →

相关内容