Oracle 19c分区表不支持实时统计信息收集,该特性仅限Exadata上的非分区表;分区表的NOTES字段始终为空,SCOPE为GLOBAL或GLOBAL AND PARTITIONED,无法通过参数启用。
oracle 19c 分区表不支持实时统计信息收集(real-time statistics)——该特性仅限 exadata 硬件平台,且明确不支持分区对象。 即使你启用了 dbms_stats 自动模式或设置了 auto_task_status,分区表的列级统计仍不会在 dml 后自动更新;notes 列查不到 stats_on_conventional_dml,scope 也不会显示 shared。
为什么分区表查不到实时统计标记
Oracle 官方文档和实测均确认:实时统计仅作用于**非分区表**。一旦表启用分区(哪怕只有一个分区),DBA_TAB_COL_STATISTICS 中对应行的 NOTES 字段始终为空,SCOPE 为 GLOBAL 或 GLOBAL AND PARTITIONED,而非 SHARED。这不是配置遗漏,是功能限制。
- 执行
SELECT TABLE_NAME, PARTITIONED, NOTES FROM DBA_TAB_STATISTICS WHERE OWNER = 'SCOTT' AND TABLE_NAME = 'SALES',若PARTITIONED = 'YES',NOTES必为空 -
_exadata_feature_on=TRUE在非 Exadata 上仅能模拟部分行为,无法绕过分区表禁用逻辑 - 即使在 Exadata 上,分区表也不被支持——不是“未实现”,而是设计上排除
分区表统计信息该靠什么更新
必须回归传统机制,但需针对性调优。自动任务(auto optimizer stats collection)和高频任务(AUTO_TASK_INTERVAL)仍可工作,只是不“实时”。
- 高频任务(默认每15分钟)会扫描
STALE分区,但只触发全分区或子分区级收集,不增量更新单列 - 自动任务依赖维护窗口(如
WEEKNIGHT_WINDOW),且受STALE_PERCENT(默认10%)和NO_INVALIDATE影响 - 对高变更分区表,建议显式设置
GRANULARITY => 'APPROX_GLOBAL AND PARTITION'避免全局重扫 - 关键分区可单独调度:
DBMS_STATS.GATHER_TABLE_STATS(ownname=>'SCOTT', tabname=>'SALES', partname=>'SALES_Q1_2026', ...)
DBMS_STATS 自动模式开启 ≠ 实时生效
DBMS_STATS.SET_GLOBAL_PREFS('AUTO_TASK_STATUS','ON') 只控制高频任务开关,与实时统计无关。它不影响 NOTES 字段,也不改变分区表行为。
- 检查高频任务是否运行:
SELECT ORIGIN, STATUS, COMPLETED FROM DBA_AUTO_STAT_EXECUTIONS WHERE ORIGIN = 'AUTO_TASK' ORDER BY START_TIME DESC - 高频任务日志里
COMPLETED计数包含分区表,但实际执行的是标准GATHER_TABLE_STATS流程 - 别混淆概念:
CONCURRENT => 'AUTOMATIC'控制并行度,REALTIME_STATS参数只用于EXPORT/IMPORT场景,不启用收集
最容易被忽略的验证点
很多人改完参数就以为“开了实时”,却没验证分区表本身是否真被覆盖。最直接的方式是:对一个已分区表做单行 UPDATE,立刻查 DBA_TAB_COL_STATISTICS 的 LAST_ANALYZED 和 NOTES —— 如果两者都没变,说明没走实时路径,这是正常现象,不是你的配置错了。











