四海内皆兄弟

数据库的自动运维-自动索引

   几乎每天都能遇到开发无意识的没有索引的SQL。究其根本原因是根本不理解,也没去考虑。有一次,领导问你说的一体机都能解决什么?开发不建立索引难道也能解决?巧了,还真能。

   我们来讲一下19C另外一个特性,自动化索引,这也是数据库AI的体现,实现了自动化运维。这里说明一下这个特性是一体机下使用效果好。非一体机的使用出了问题官方不支持。我们这里模拟是可以的。

Image

                                                                                              图1

    首先如图1创建一个表,如图1.然后给表中插入数据,我写了一个存储过程。

create or replace procedure ii

as

z varchar2(10);

begin

  for i in 1..1000000 loop

    SELECT DBMS_RANDOM.STRING (‘A’, 10) into z FROM DUAL;

    insert into i values (i,z,sysdate-i/1440);

    end loop;

    commit;

    end;

Image

                                                            图2

如图2中xxg是xuexiaogang的缩写,数据库是PDB2.    在命令中中执行这个存储过程写入了100万条数据。打开自动化索引的隐藏参数,(因为是一体机下才好用,非一体机就是不推荐使用。)

alter system set "_exadata_feature_on"=true scope=spfile;如图3

Image

                                                                      图3

这也意味着数据库要重启。如图4重启数据库。

Image

                                                                            图4

    把数据库自动索引的功能打开(选择哪种)。这里有三种分别是。这里传递一个信息,也有些公司有严格的把控,不轻易使用这个功能。我们这里演示采用第一种如图5.

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

启用自动索引

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

启用自动索引,但只作为不可见自动索引,无法被SQL所使用:

SQL> EXEC DBMS_AUTO_INDEX.CONFIGURE('AUTO_INDEX_MODE', 'OFF');

关闭自动索引

Image

                                                                            图5

而且这个参数要在PDB级别设定。如图6,我们在CDB上确认一下,我在PDB2这个数据库上设置的是不是生效了。

Image

                                                                                            图6

COLUMN parameter_name FORMAT A40

COLUMN parameter_value FORMAT A20

SELECT con_id, parameter_name, parameter_value FROM cdb_auto_index_config;

接下来我们看看执行计划,现在是没有索引,所以如图7是全表扫描。对象是XXG(xuexiaogang)

Image

                                                                                                                             图7

注意这里我们要收集统计信息,否则如图8一样,是不会有作用。

Image

                                                                                                                                  图8

收集统计信息的方法,使用管理用户运行程序包。如图9(在PDB下)

Image

                                                                                                                                图9

收集统计完毕,检查一下,否则如图10,数据库知道这个表有100万记录了。

Image

                                                                                                                                     图10

我们在编写一个存储过程图11,

Image

                                                                                                                              图11

执行存储过程。让他反复查如图12,让数据库知道多次全表以后,自己根据场景去创建索引。

Image

                                                                                                                                 图12

最后果然现在不是全表了,有索引了(图13),索引是SYS用户建立的,带了AI开头说明是AI推荐的索引。

Image

                                                                                                                   图13

虽然在非Exadata下也可以实现,但是自动化索引是依靠强大的IO才能完成的,没有强大的IO,这样做会导致系统带来不稳定的因素。

       开发不建立索引是低级问题,说到根本上其实是技术问题更加是管理问题。法不责众时候怎么办?随着技术的进步,是可以解决的。数据库加硬件结合解决,缺一不可。

现在不少数据库产品都开始做AI了,我今天听说TiDB的打一段英文,自动写 SQL。这是面向开发的AI。Oracle这个自动索引是2018年的,是面向运维的AI。

Image