Oracle Database 19c当中包含的新特性众多,我们今天向大家介绍“自动索引”。索引对大家来说都不陌生,我们创建索引是为了加速查询,但是大家都知道,索引的维护和存储往往是一个大问题。有时候我们为不必要的字段创建了索引,浪费了存储空间、付出不必要的维护成本,有时候我们因为没有在应有索引的字段创建索引而损失了性能。我们之前就在想,什么时候索引的创建和删除可以由数据库自己来完成呢?在19c,这个功能终于实现了。今天就请您和我们一起来体验自动索引带给我们的方便与高效。
我们首先创建一个19c环境,今天我们使用Linux为我们的操作系统。在Linux上安装Oracle Database 19c只需要执行3个脚本即可。您可以先观看下方3分钟左右的录像,体验一下在19c安装的方便与快捷。
第一步:执行环境准备脚本
我们在Linux当中安装之前版本的数据库安装时,也会安装类似的安装包,在Oracle Enterprise Linux5(以下简称OEL)的时候,在图形界面中就可以选择这个安装包,但是在后续的OEL中,有些朋友反映找不到这个包,其实它一直都在,只不过名字会发生变更。
在安装19c时,您可以像我一样在线安装(如果您的Linux可以联网的话),您也可以来到我公司官网进行下载,我将这个预先环境准备包的rpm文件下载地址放在文末的“阅读原文”链接中,您可以点击“阅读原文”进行下载。
这个安装包将帮助大家对Linux系统进行配置,创建oracle用户及修改系统参数等。
第二步:下载安装包并执行安装动作
您可以来到我公司官网下载19.3数据库rpm包,地址如下:https://www.oracle.com/database/technologies/oracle19c-linux-downloads.html
我将下载好的rpm放在/u01下面,然后通过root用户使用yum的方式进行安装,安装大概需要5-10分钟的时间。
安装结束后,您将看到如下界面。
按照上面的提示,我们可以使用root用户执行一个脚本,创建出一个示例数据库,容器数据库的名字是ORCLCDB,PDB的名字是ORCLPDB1,如果您不喜欢默认的数据库配置,您可以通过修改下面红框中的脚本对数据库进行客制化。今天我们暂时不对配置文件做修改,直接执行。
数据库创建的时间大概10分钟左右,具体时间要看您的硬件环境。
当您看到如下界面,表示数据库已经创建完毕,下图中红框告知您创建的数据库信息。
为了方便操作,我们设定oracle用户的.bash_profile,请按照如下方式进行设定。请注意,oracle用户已经在安装预先环境rpm的时候为大家创建好,大家从root用户直接su - oracle就可以转换过去。
如上图,我们使用SQL Plus看看数据库情况。
但是我们创建的数据库没有测试数据,我们接下来执行系统自带脚本,将HR用户创建出来,并将我们在教学时经常使用的表创建出来。请按照下图执行脚本,并给出参数,因为参数都很简单,提示也非常明确,这里就不再赘述了。
至此,数据库准备环境就完成了。
第一步:首先我们看看自动所以是否已经启动,请按照下图进行操作:
我们通过观察发现“AUTO_INDEX_MODE”是OFF状态,说明还没有启动自动索引功能。
第二步:启动自动索引
我们通过DBMS_AUTO_INDEX这个Package中的存储过程启动自动索引。
自动索引有三种状态:
-
IMPLEMENT : 启动自动索引,用来提升性能的新索引将被优化器启用并将索引状态设定为可见。
-
REPORT ONLY: 启动自动索引功能,但是索引的状态为不可见。
-
OFF : 关闭自动索引功能。
我们可以通过执行如下语句来修改自动索引的状态:
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');
我们先将自动索引的状态设定为IMPLEMENT,自动索引目前只在Exadata上运行的19c可以使用。
然后来到容器数据库,设定自动索引功能。
执行脚本看看自动索引是否启动,通过观察发现已经启动了。
我们来到PDB看看,首先要打开PDB,因为刚才我们将CDB重启了,之后没有执行PDB的open命令。
通过观察,发现PDB上的自动索引没有启动。
那么我们现在将PDB上的自动索引也启动起来。
第三步:设定自动索引所使用的表空间
大家知道索引是需要存储空间的。默认情况下,自动索引将使用系统默认的永久表空间作为自己的存储空间,如果您觉得这不合适,您可以创建属于自动索引自己的表空间。我们将/u01/dbf作为数据文件存储的位置。
然后创建表空间
接下来,通过存储过程设定我们刚创建好的表空间为自动索引的存储表空间。
如果您执行了如下语句,将使用系统默认的永久表空间作为自动索引的存储表空间。
第四步:设定schema的自动索引功能
默认情况下,所有的schemas都将被使用自动索引功能,但如果您想有针对性地启用自动索引功能,可以通过DBMS_AUTO_INDEX.CONFIGURE这个存储过程进行配置。我们首先看看在没有进行特定schema配置之前的自动索引状态。
通过观察,在auto_index_schema当中,是空白,没有特殊设定,表示所有的schema都启用了自动索引。
我们现在想通过设定,只对HR这个schema启用自动索引。
可以通过将schema设定为NULL,恢复到初始状态,即对所有的schemas都启用自动索引功能。
刚才设定的是:指定某些schemas使用自动索引功能,我们可以将上面的参数修改一下,指定某些schemas不使用自动索引。比如,我们创建一个schema叫做HY,让这个schema不使用自动索引的功能。
可以通过下面的设定,清除这种“不包含”设定。
关于自动索引的其他设定,比如是否启用压缩、自动索引日志保留时间等,今天就不为大家介绍了,感兴趣的朋友可以参考我公司的官方网文档:https://docs.oracle.com/en/database/oracle/oracle-database/19/arpls/DBMS_AUTO_INDEX.html
第五步:验证自动索引功能
我们在ORCLPDB1这个PDB当中的HR schema下面创建一个比较大的表,然后我们通过PL/SQL去反复查询这个表中的一个字段,看看系统是否可以创建出自动索引来。
建表语句如下:
create table hr.big1 as select rownum id,t.* from dba_objects t;
然后我们通过一个PL/SQL反复去查询它的ID字段:
declare
a varchar2(2000) := '';
begin
for x in 1.. 10000 loop
select object_name into a from hr.big1 where id=x;
end loop;
end;
/
您现在可以去做其他的事情,为什么?因为自动索引的JOB是每15分钟执行一次。所以,如果刚执行完上面的语句,马上就去通过下面红色框的SQL语句去查询自动索引创建的状态,可能看不到任何结果。请稍等一会儿,然后再去查询。
我们在等待的时候,可以看看系统后台是否有这样的JOB,通过下面的查询,我们看到有3个JOB是与自动索引有关的。
通过观察上面的结果发现,系统自己创建了索引,名字是以SYS_AI开头的,AI就是自动索引的意思吧。
关于更多的自动索引的信息,您可以查询Oracle官方文档。https://docs.oracle.com/en/database/oracle/oracle-database/19/admin/managing-indexes.html#GUID-D1285CD5-95C0-4E74-8F26-A02018EA7999