oracle 19c自动索引仅限exadata企业版,需设auto_index_mode=implement并经sql多次执行与性能验证后才转为可见索引;新sql、陈旧统计信息或黑名单sql均无法使用,且依赖专用表空间与合理空间预算。
oracle 19c 的自动索引功能不能直接“开启就提速”,它只在满足特定前提、经过充分验证后才可能生成有效索引;盲目启用反而可能引入不可见索引堆积、sql 黑名单误判或空间预算超限等问题。
自动索引是否可用,先看版本和许可限制
自动索引仅在 Oracle Database Enterprise Edition + Exadata 平台官方支持。非 Exadata 环境虽可通过 _exadata_feature_on=true 强制启用,但该参数:
• 是未记录的隐藏参数,生产环境严禁使用
• 修改后需重启实例,且后续行为不受 Oracle 支持
• 在普通 x86 服务器上测试时,常出现候选索引不生成、验证失败率高、报告为空等现象
• DBA_AUTO_INDEX_CONFIG 视图中若查不到配置项,大概率是许可证或平台不满足
AUTO_INDEX_MODE 设置为 IMPLEMENT 还是 REPORT ONLY?
这是最关键的开关,直接影响索引是否真正参与执行计划:
• AUTO_INDEX_MODE = 'IMPLEMENT':自动创建不可见索引 → 测试性能 → 成功则设为可见(VISIBLE),失败则标记 UNUSABLE 并加入 SQL 黑名单
• AUTO_INDEX_MODE = 'REPORT ONLY':只创建不可见索引,不做性能验证,也不改变可见性,仅生成报告供人工评估
• 初次启用建议先用 REPORT ONLY 模式运行 24–48 小时,检查 DBA_AUTO_INDEX_REPORTS 输出,确认候选列合理、无误删风险后再切到 IMPLEMENT
为什么创建了自动索引,EXPLAIN PLAN 却没走?
常见原因不是功能失效,而是触发条件未满足:
• 自动索引默认以 SYS_AI 开头,且初始为 INVISIBLE,必须通过验证才会变为 VISIBLE
• 验证只针对已执行过多次(通常 ≥3 次)、有稳定执行计划、且统计信息新鲜的 SQL —— 新上线语句或刚收集完统计信息后立即跑一次,不会触发验证
• 若某 SQL 在验证中性能未提升(例如因数据倾斜、绑定变量窥探失效),会被加入黑名单,后续即使加了索引也跳过测试
• 表必须有准确的统计信息:DBMS_STATS.GATHER_TABLE_STATS 执行后,LAST_ANALYZED 时间不能太旧,否则自动索引过程会跳过该表
关键配置项怎么调才不踩坑?
几个核心参数的实际影响比文档描述更敏感:
• AUTO_INDEX_SPACE_BUDGET 默认 50(单位 %),指自动索引占用的默认表空间配额。若设为 0 或负数,自动索引会停摆;设得过高(如 80)可能导致表空间爆满而阻塞 DML
• AUTO_INDEX_DEFAULT_TABLESPACE 必须显式指定一个**非 SYSTEM、非 SYSAUX** 的专用表空间,且该表空间需开启自动扩展(AUTOEXTEND ON)
• AUTO_INDEX_RETENTION_FOR_AUTO 控制未使用自动索引的保留天数,默认 373 天。若业务查询模式变化快,建议调低至 30–90,避免残留大量 UNUSABLE 索引拖慢 DDL
• AUTO_INDEX_SCHEMA 可限制仅对特定 schema 启用,但注意:它不支持通配符,多个用户需逐个配置
最易被忽略的一点:自动索引不是“替代 DBA 的工具”,而是“放大 DBA 判断力的杠杆”。它依赖高质量的 SQL 负载样本、稳定的统计信息、合理的表空间策略 —— 任何一环脱节,生成的都不是优化,而是隐患。











