数据库的自动运维-自动索引
几乎每天都能遇到开发无意识的没有索引的SQL。究其根本原因是根本不理解,也没去考虑。有一次,领导问你说的一体机都能解决什么?开发不建立索引难道也能解决?巧了,还真能。
我们来讲一下19C另外一个特性,自动化索引,这也是数据库AI的体现,实现了自动化运维。这里说明一下这个特性是一体机下使用效果好。非一体机的使用出了问题官方不支持。我们这里模拟是可以的。
图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;
图2
如图2中xxg是xuexiaogang的缩写,数据库是PDB2. 在命令中中执行这个存储过程写入了100万条数据。打开自动化索引的隐藏参数,(因为是一体机下才好用,非一体机就是不推荐使用。)
alter system set "_exadata_feature_on"=true scope=spfile;如图3
图3
这也意味着数据库要重启。如图4重启数据库。
图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');
关闭自动索引
图5
而且这个参数要在PDB级别设定。如图6,我们在CDB上确认一下,我在PDB2这个数据库上设置的是不是生效了。
图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)
图7
注意这里我们要收集统计信息,否则如图8一样,是不会有作用。
图8
收集统计信息的方法,使用管理用户运行程序包。如图9(在PDB下)
图9
收集统计完毕,检查一下,否则如图10,数据库知道这个表有100万记录了。
图10
我们在编写一个存储过程图11,
图11
执行存储过程。让他反复查如图12,让数据库知道多次全表以后,自己根据场景去创建索引。
图12
最后果然现在不是全表了,有索引了(图13),索引是SYS用户建立的,带了AI开头说明是AI推荐的索引。
图13
虽然在非Exadata下也可以实现,但是自动化索引是依靠强大的IO才能完成的,没有强大的IO,这样做会导致系统带来不稳定的因素。
开发不建立索引是低级问题,说到根本上其实是技术问题更加是管理问题。法不责众时候怎么办?随着技术的进步,是可以解决的。数据库加硬件结合解决,缺一不可。
现在不少数据库产品都开始做AI了,我今天听说TiDB的打一段英文,自动写 SQL。这是面向开发的AI。Oracle这个自动索引是2018年的,是面向运维的AI。