oracle 19c分区表全局统计默认不自动更新,必须显式启用incremental=true并配合适当参数;否则仅刷新分区级统计,导致执行计划异常、num_rows失真等问题。
oracle 19c 分区表的统计信息不会自动“全量”更新全局统计,除非你显式启用增量(incremental)模式并配对正确的全局参数。默认情况下,哪怕自动任务跑了,也只刷新分区级统计,全局统计仍可能陈旧甚至错误。
为什么分区表的全局统计容易不准
Oracle 对分区表的全局统计(比如 num_rows、列的 num_distinct)默认是「全表扫描聚合」得出的。但一旦表很大、分区很多,这种计算成本高、阻塞重、还常被跳过——尤其是自动任务(auto optimizer stats collection)默认不触发全表扫描来算全局值。
典型现象包括:
- 查询执行计划突然变差,
EXPLAIN PLAN显示预估行数比实际小几个数量级 -
DBA_TAB_STATISTICS中GLOBAL_STATS = 'NO',且NUM_ROWS为NULL或明显偏低 - 新增一个大分区后,
SELECT COUNT(*) FROM big_part_table很快,但优化器却认为该表只有几百行
必须设置 INCREMENTAL = TRUE 才能真正启用增量全局统计
仅靠开启自动收集或调高 DEGREE 并不能让全局统计“自动跟上”。核心开关是 INCREMENTAL 参数,它控制数据库是否用分区级摘要(synopsis)来合成全局统计。
执行以下语句启用:
EXEC DBMS_STATS.SET_TABLE_PREFS( ownname => 'SCHEMA_NAME', tabname => 'TABLE_NAME', pname => 'INCREMENTAL', pvalue => 'TRUE' );
关键点:
-
INCREMENTAL = TRUE后,每次只收集新分区或变更分区的统计,并自动合并到全局摘要中(写入WRI$_OPTSTAT_SYNOPSIS$) - 全局
NUM_DISTINCT使用 HyperLogLog 算法估算,精度足够,且避免了SUM(partition NDV)这种错误叠加 - 必须配合
GRANULARITY = 'AUTO'或'ALL'才生效;若设为'GLOBAL',则跳过分区级收集,反而破坏增量链 - 该设置只对后续收集生效,已有陈旧全局统计需手动触发一次
GATHER_TABLE_STATS(..., granularity => 'ALL')来初始化摘要
影响自动收集行为的三个关键全局参数
自动任务是否真正为分区表做增量收集,取决于这三个 DBMS_STATS 全局配置项:
-
CONCURRENT:决定是否并发执行多个分区的统计收集。设为'ALL'(非'OFF')才能在自动任务中真正并行处理分区 -
AUTO_TASK_STATUS:控制高频自动任务开关。设为'ON'后,每 15 分钟(可调)检查陈旧分区并触发轻量收集 -
GRANULARITY全局默认值不生效——它必须在表级或收集时显式指定。全局SET_GLOBAL_PREFS('GRANULARITY', ...)被 Oracle 忽略,文档明确说明该参数无全局作用域
推荐组合设置:
EXEC DBMS_STATS.SET_GLOBAL_PREFS('CONCURRENT', 'ALL');
EXEC DBMS_STATS.SET_GLOBAL_PREFS('AUTO_TASK_STATUS', 'ON');
EXEC DBMS_STATS.SET_GLOBAL_PREFS('AUTO_TASK_INTERVAL', '900'); -- 15分钟检查一次
最容易被忽略的权限与依赖项
即使参数全开,自动任务也可能静默失败:
- 执行自动任务的用户(通常是
ORACLE_OCM或DBSNMP)必须有MANAGE SCHEDULER和CREATE JOB权限,否则任务注册失败 -
job_queue_processes需 ≥ 2(建议 ≥ 4),否则并发任务排队卡住,看起来像“没运行” - 分区表若含虚拟列或扩展统计,需确保
METHOD_OPT表级设置兼容(如'FOR ALL COLUMNS SIZE AUTO'),否则摘要生成失败,全局统计回退为NULL - 检查摘要是否真实存在:
SELECT COUNT(*) FROM WRI$_OPTSTAT_SYNOPSIS$ WHERE BO# = (SELECT OBJECT_ID FROM DBA_OBJECTS WHERE OWNER='SCHEMA_NAME' AND OBJECT_NAME='TABLE_NAME');返回 0 就说明增量链根本没建起来
增量统计不是“设完就稳”,它依赖摘要持续存在、合并逻辑未中断、且每次收集都带正确粒度——漏掉其中任一环,全局统计就会悄然失效。











