<< 返回文章列表

Oracle 19c 新特性:自动索引 Automatic indexing

2019年2月19日
盖国强
2480

自动索引功能可自动执行Oracle数据库中的索引管理任务。 自动索引根据应用程序工作负载的变化自动创建,重建和删除数据库中的索引,从而提高数据库性能。 自动管理的索引称为自动索引 - Automatic Indexing。


索引结构是数据库性能的基本特征。 索引对于OLTP应用程序至关重要,OLTP应用程序使用大型数据集并每天运行数百万条SQL语句。 索引对于数据仓库应用程序也很重要,这些应用程序通常从非常大的表中查询相对少量的数据。 如果在应用程序工作负载发生更改时不更新索引,则现有索引可能会导致数据库性能显着下降。

自动索引通过基于应用程序工作负载的变化在Oracle数据库中自动和动态地管理索引来提高数据库性能。


自动索引提供以下功能:

  • 以预定义的时间间隔定期在后台运行自动索引过程。

  • 分析应用程序工作负载,并相应地创建新索引并删除现有性能不佳的索引以提高数据库性能。

  • 重建由于表分区维护操作而标记为不可用的索引,例如ALTER TABLE MOVE。

  • 提供PL / SQL API,用于在数据库中配置自动索引并生成与自动索引操作相关的报告。


自动索引过程每15分钟在后台运行,并执行以下操作:

1.识别自动索引候选者

根据SQL中表列的用法来识别自动索引候选声明。

2.为自动索引候选创建不可见的自动索引

自动索引候选项被创建为不可见的自动索引,也就是说,这些自动索引不能在SQL语句中使用。

3.根据SQL语句验证不可见的自动索引

不可见的自动索引根据SQL语句进行验证。

如果通过使用这些索引来提高SQL语句的性能,则将索引配置为可见索引,以便可以在SQL语句中使用它们。

如果使用这些索引未提高SQL语句的性能,则将索引配置为不可用索引,并将SQL语句列入黑名单。稍后将通过自动索引过程删除不可用的索引。将来,黑名单的SQL语句不允许使用自动索引。

4.删除未使用的自动索引

将删除长时间未使用的自动索引。


您可以使用 DBMS_AUTO_INDEX.CONFIGURE 过程在Oracle数据库中配置自动索引。

以下部分介绍了可以使用DBMS_AUTO_INDEX.CONFIGURE过程指定的一些配置设置。

启用和禁用数据库中的自动索引

可以使用AUTO_INDEX_MODE配置设置在数据库中启用或禁用自动索引。

以下SQL语句在数据库中启用自动索引,并将任何新的自动索引创建为可见索引,以便可以在SQL语句中使用它们:

EXEC DBMS_AUTO_INDEX.CONFIGURE('AUTO_INDEX_MODE','IMPLEMENT');

以下SQL语句在数据库中启用自动索引,但会将任何新的自动索引创建为不可见的索引,以便它们不能在SQL语句中使用:

EXEC DBMS_AUTO_INDEX.CONFIGURE('AUTO_INDEX_MODE','REPORT ONLY');

以下SQL语句禁用数据库中的自动索引,因此不会创建新的自动索引,并禁用现有的自动索引:

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');

指定要为自动索引分配的表空间的百分比

您可以使用AUTO_INDEX_SPACE_BUDGET配置设置指定要为自动索引分配的表空间百分比。 仅当用于存储自动索引的表空间是在数据库创建期间指定的默认永久表空间时,即未为AUTO_INDEX_DEFAULT_TABLESPACE配置设置指定任何值时,才可以指定此配置设置。

以下SQL语句为自动索引分配5%的表空间:

EXEC DBMS_AUTO_INDEX.CONFIGURE('AUTO_INDEX_SPACE_BUDGET','5');


您可以使用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,显示与自动索引相关的配置设置的修改历史记录。


以上内容参考官方文档译出,供读者参考。