自动索引功能可自动执行Oracle数据库中的索引管理任务。根据应用程序工作负载的变化自动创建、重建和删除数据库中的索引,从而提高数据库性能。
Automatic indexing特性对于on-prem环境仅支持Oracle Exadata平台,对于Oracle Cloud各个Cloud Edition都支持。
Automatic Indexing Process(自动索引过程)以后台服务进程每隔15分钟运行一次,并执行如下任务:
定期将应用程序SQL历史记录捕获到SQL存储库中(包括SQL,执行计划,绑定变量,统计信息等)
- 确定可能使新捕获的SQL语句受益的候选索引
- 将候选索引创建为不可用的不可见索引(仅元数据)
- 删除因新建索引而废弃的索引(逻辑合并)
- 优化器判断是否将候选索引用于捕获的SQL语句
- 实现索引并运行SQL以验证索引是否可以提高语句性能
- 所有验证均在应用程序工作流外完成
- 如果使所有语句的性能都更好,则索引将标记为可见
- 如果使所有语句的性能都更差,则索引仍然不可见
- 如果会使某些SQL的性能更差,则除这些SQL之外,索引标记为可见
- 持续在线为其他语句验证新索引
- 只允许执行SQL语句的一个会话使用新索引
- 持续监控索引使用情况
- 删除长时间未使用的自动创建的索引
说明
1)当前版本Auto indexes 是local B-tree 索引,将来或许也会支持bitmap、FBI、Partial、domain等类型。
2)当前版本支持分区和非分区表,不支持临时表。
可以使用AUTO_INDEX_MODE设置在数据库中启用或禁用自动索引。
在数据库中启用自动索引,并将任何新的自动索引创建为可见索引
EXEC DBMS_AUTO_INDEX.CONFIGURE('AUTO_INDEX_MODE','IMPLEMENT');
在数据库中启用自动索引,但会将任何新的自动索引创建为不可见的索引
EXEC DBMS_AUTO_INDEX.CONFIGURE('AUTO_INDEX_MODE','REPORT ONLY');
禁用数据库中的自动索引(不会创建新的自动索引,并禁用现有的自动索引)
EXEC DBMS_AUTO_INDEX.CONFIGURE('AUTO_INDEX_MODE','OFF');
可以使用AUTO_INDEX_SCHEMA配置设置来指定可以使用自动索引的模式。
以下示例将SH和HR模式添加到排除列表中,以便SH和HR模式不能使用自动索引:
EXEC DBMS_AUTO_INDEX.CONFIGURE('AUTO_INDEX_SCHEMA','SH',FALSE);
EXEC DBMS_AUTO_INDEX.CONFIGURE('AUTO_INDEX_SCHEMA','HR',FALSE);
以下SQL语句从排除列表中删除HR模式,以便HR模式可以使用自动索引:
EXEC DBMS_AUTO_INDEX.CONFIGURE('AUTO_INDEX_SCHEMA','HR',NULL);
以下SQL语句从排除列表中删除所有模式,以便所有模式都可以使用自动索引:
EXEC DBMS_AUTO_INDEX.CONFIGURE('AUTO_INDEX_SCHEMA',NULL,TRUE);
您可以使用AUTO_INDEX_RETENTION_FOR_AUTO设置指定在数据库中保留未使用的自动索引的时间段。 在指定的保留期后,将删除未使用的自动索引。
以下SQL语句将未使用的自动索引的保留期设置为90天。
EXEC DBMS_AUTO_INDEX.CONFIGURE('AUTO_INDEX_RETENTION_FOR_AUTO','90');
以下SQL语句将自动索引的保留期重置为默认值373天。
EXEC DBMS_AUTO_INDEX.CONFIGURE('AUTO_INDEX_RETENTION_FOR_AUTO',NULL);
您可以使用AUTO_INDEX_RETENTION_FOR_MANUAL设置指定在数据库中保留未使用的非自动索引(手动创建的索引)的时间段。 在指定的保留期后,将删除未使用的非自动索引。
以下SQL语句将未使用的非自动索引的保留期设置为60天。
EXEC DBMS_AUTO_INDEX.CONFIGURE('AUTO_INDEX_RETENTION_FOR_MANUAL','60');
以下SQL语句将未使用的非自动索引的保留期设置为NULL,这意味着它们永远不会被自动索引过程删除。
EXEC DBMS_AUTO_INDEX.CONFIGURE('AUTO_INDEX_RETENTION_FOR_AUTO',NULL);
您可以使用AUTO_INDEX_REPORT_RETENTION设置指定在数据库中保留自动索引日志的时间段。 在指定的保留期后,将删除自动索引日志。
以下SQL语句将自动索引日志的保留期设置为60天。
EXEC DBMS_AUTO_INDEX.CONFIGURE('AUTO_INDEX_REPORT_RETENTION','60');
以下SQL语句将自动索引日志的保留期重置为默认值31天。
EXEC DBMS_AUTO_INDEX.CONFIGURE('AUTO_INDEX_REPORT_RETENTION',NULL);
您可以使用AUTO_INDEX_DEFAULT_TABLESPACE配置设置指定用于存储自动索引的表空间。
以下SQL语句指定TBS_AUTO的表空间来存储自动索引:
EXEC DBMS_AUTO_INDEX.CONFIGURE('AUTO_INDEX_DEFAULT_TABLESPACE','TBS_AUTO');
您可以使用AUTO_INDEX_TEMP_TABLESPACE设置来指定用于存储自动索引的临时表空间。
以下SQL语句指定TBS_AUTO_TEMP临时表空间来存储自动索引:
EXEC DBMS_AUTO_INDEX.CONFIGURE('AUTO_INDEX_TEMP_TABLESPACE','TBS_AUTO_TEMP');
您可以使用AUTO_INDEX_SPACE_BUDGET配置设置指定要为自动索引分配的表空间百分比。 仅当用于存储自动索引的表空间是在数据库创建期间指定的默认永久表空间时,即未为AUTO_INDEX_DEFAULT_TABLESPACE配置设置指定任何值时,才可以指定此配置设置。
以下SQL语句为自动索引分配5%的表空间:
EXEC DBMS_AUTO_INDEX.CONFIGURE('AUTO_INDEX_SPACE_BUDGET','5');
以下SQL语句指定TBS_AUTO_TEMP的表空间来存储临时自动索引结构:
EXEC DBMS_AUTO_INDEX.CONFIGURE('AUTO_INDEX_TEMP_TABLESPACE','TBS_AUTO_TEMP');
您可以使用DBMS_AUTO_INDEX包的REPORT_ACTIVITY和REPORT_LAST_ACTIVITY函数生成与Oracle数据库中的自动索引操作相关的报告。
生成特定时间段的自动索引操作报告
以下示例生成包含过去24小时内自动索引操作信息的报告。默认情况下,报告以纯文本格式生成。
declare
report clob := null;
begin
report := DBMS_AUTO_INDEX.REPORT_ACTIVITY();
end;
以下示例生成包含有关2018年11月的自动索引操作的基本信息报告。报告以HTML格式生成,仅包含自动索引操作的摘要。
declare
report clob := null;
begin
report := DBMS_AUTO_INDEX.REPORT_ACTIVITY(
activity_start => TO_TIMESTAMP('2018-11-01', 'YYYY-MM-DD'),
activity_end => TO_TIMESTAMP('2018-12-01', 'YYYY-MM-DD'),
type => 'HTML',
section => 'SUMMARY',
level => 'BASIC');
end;
生成上次自动索引操作的报告
以下示例生成包含有关上次自动索引操作的报告。 默认情况下,报告以纯文本格式生成。
declare
report clob := null;
begin
report := DBMS_AUTO_INDEX.REPORT_LAST_ACTIVITY();
end;
以下示例生成包含有关上次自动索引操作的报告。 该报告包括上次自动索引操作的摘要、索引详细信息和错误信息。 报告以HTML格式生成。
declare
report clob := null;
begin
report := DBMS_AUTO_INDEX.REPORT_LAST_ACTIVITY(
type => 'HTML',
section => 'SUMMARY +INDEX_DETAILS +ERRORS', level => 'BASIC');
end;
DBA_AUTO_INDEX_EXECUTIONS,显示自动索引操作的执行历史记录。
DBA_AUTO_INDEX_STATISTICS ,显示与自动索引相关的各种统计信息
DBA_AUTO_INDEX_IND_ACTIONS , 显示对自动索引执行的各种操作。
DBA_AUTO_INDEX_SQL_ACTIONS,显示对SQL语句执行的各种操作,以验证自动索引。
DBA_AUTO_INDEX_CONFIG,显示与自动索引相关的配置设置的修改历史记录。
_optimizer_auto_index_allow
_optimizer_use_auto_indexes
col name format a40
SELECT x.ksppinm NAME, y.ksppstvl VALUE
FROM SYS.x$ksppi x, SYS.x$ksppcv y
WHERE x.inst_id = USERENV ('Instance')
AND y.inst_id = USERENV ('Instance')
AND x.indx = y.indx
AND x.ksppinm LIKE '%index%';
http://otndnld.oracle.co.jp/ondemand/technight/20190422-TechNight28-1_19c_NewFeatures_DL_final.pdf
https://static.rainfocus.com/oracle/oow18/sess/1523250557343001OBEw/PF/TRN3980_Test_Drive_Auto_Index_Creation_in_ADB_1541192406753001UYd0.pdf
http://enmotech.com/web/detail/1/645/1.html
https://docs.oracle.com/en/database/oracle/oracle-database/19/admin/managing-indexes.html#GUID-A8B4BB05-2711-497A-8276-127076DAA518
http://www.bigdatalyn.com/2019/02/19/Oracle_19c_AutomaticIndexing_Tips/
https://docs.oracle.com/en/database/oracle/oracle-database/19/dblic/Licensing-Information.html#GUID-0F9EB85D-4610-4EDF-89C2-4916A0E7AC87
https://www.askmaclean.com/archives/19c-_optimizer_auto_index_allow.html