目录
Automatic indexing 自动化索引概述:
Automatic Indexing 工作原理:
启用、禁用自动索引:
指定用户启用自动索引:
指定未使用的非自动索引的保留时间:
指定自动化索引日志的保留时间:
指定存储自动索引的表空间:
生成自动化索引报告:
自动化索引相关视图:
实验
1.查看 Oracle 数据库版本
2.开启 Automatic Indexing 特性
3.开启隐患参数并重启数据库
4.开启 Automatic Indexing 特性 (CDB)
5.开启 Automatic Indexing 特性 ( PDB)
Automatic indexing 是 Oracle Database 19c 的新特性,依据应用负载的变 化,自动/动态地进行索引的管理,如:创建(create index)、重构(rebuild index) 和删除(drop index),从而提高数据库性能,无需人工干预。可以为分区表和非 分区表创建自动索引,无法为临时表创建自动索引。
自动索引提供以下功能:
*以指定时间间隔定期运行自动化索引特性。
*分析应用程序工作负载,并相应地创建新索引并删除现有性能不佳的索
引以提高数据库性能。
*重建由于表分区维护操作而标记为不可用的索引,例如 ALTER TABLE MOVE。
*提供了PL/SQL API 接口,用于在数据库中配置自动索引并生成与自动索引操作相关的报告。
Automatic Indexing 可以自动的 create, rebuild , drop 索引。Automatic Indexing 每 15 分钟调用一次,并执行如下任务:
1.识别自动索引候选项
通过捕获 SQL 历史到 SQL repository (包括 SQL,执行计划,绑定变量,统 计信息等) ,识别SQL 语句中用到列的使用情况来标识自动索引候选项。
2.为自动索引候选项创建 invisible 的自动索引
Invisible Indexes 是 11g 中提出的新功能,缺省对优化器是不可见的,也 就是说不会影响到用户既有的SQL 语句。
3.根据 SQL 语句验证不可见的自动索引
如果通过使用这些自动索引提高了SQL 语句的性能,那么会将这些索引配置 为可见索引,以便在 SQL 语句中使用它们。
如果使用这些索引不能提高 SQL 语句的性能,则将这些索引置为unusable 的索引,并将对应的 SQL 语句列入“黑名单” 。unusable 的索引稍后会被自动 索引过程删除。被列入“黑名单”的 SQL 语句将来不允许使用自动索引。
注:第一次执行的SQL 语句无法使用自动索引,原因是 Oracle 无法对该 SQL 语句做出有效的判断。
4.清除 unused auto indexes
对于长时间不使用的 auto indexes 会自动进行清除工作。缺省是 373 天, 可以使用 DBMS_AUTO_INDEX.CONFIGURE 过程来配置数据库中保留未使用的自动 索引的时间段。
Automatic Indexing 也是基于传统手动优化 SQL 的思路,基于 SQL 中的列使 用识别可以创建的索引,然后验证自动索引对性能的影响,然后按预设的值去创 建索引,只不过整个过程是自动的。
SQL> alter system set "_exadata_feature_on"=true scope=spfile ; 1、启用
exec dbms_auto_index.configure('auto_index_mode','implement') ; 2、启用,但是只作为不可见自动索引,无法被 sql所使用
exec dbms_auto_index.configure('auto_index_mode','report only') ; 3、禁用
exec dbms_auto_index.configure('auto_index_mode','off') ;
set linesize 200
col parameter_name format a40
col parameter_value format a20
col last_modified format a20
col modified_by format a20
select * from dba_auto_index_config ;
默认情况下,如果启用了自动索引,那么数据库中的所有用户都可以使用自 动索引。
1、除 scott 用户外,其他用户使用自动索引
exec dbms_auto_index.configure('auto_index_schema','scott',false) ; 2、只有 scott 用户可以使用自动索引
exec dbms_auto_index.configure('auto_index_schema', 'scott', null) ; 3、所有用户都可以使用自动索引
exec dbms_auto_index.configure('auto_index_schema', null, true) ; set linesize 200
col parameter_name format a40
col parameter_value format a20
col last_modified format a20
col modified_by format a20
select * from dba_auto_index_config ;
通过 auto_index_retention_for_manual 配置指定非自动索引 (手动创建的 索引) 的保留时间。如果超过该时间还没被使用的非自动索引也会被删除。默认 情况下,非自动索引是永远不会被删除的。
1、配置保留时间 60 天
exec dbms_auto_index.configure('auto_index_retention_for_manual', '60') ;
2、配置永远不删除
exec dbms_auto_index.configure('auto_index_retention_for_auto', null) ;
set linesize 200
col parameter_name format a40
col parameter_value format a20
col last_modified format a20
col modified_by format a20
select * from dba_auto_index_config ;
通过 auto_index_report_retention 配置指定自动化索引日志的保留时间。 超过该时间的自动索引日志会被删除。默认情况, 自动索引日志会在 31 天后被 删除。
1、指定 60 天后删除
exec dbms_auto_index.configure('auto_index_report_retention', '60') ;
2、重置保留时间,恢复到 31 天后删除
exec dbms_auto_index.configure('auto_index_report_retention', null) ;
set linesize 200
col parameter_name format a40
col parameter_value format a20
col last_modified format a20
col modified_by format a20
select * from dba_auto_index_config ;
由于自动化索引报告是根据自动索引日志生成的,所以如果日志被删除了那 么是无法生成报告的。
通过 auto_index_default_tablespace 配置指定一个表空间用于存储自动索 引。默认情况下,在数据库创建期间指定的永久表空间用于存储自动索引。
1、指定表空间 TBS_AUTO
exec dbms_auto_index.configure('auto_index_default_tablespace', 'users') ;
2、指定表空间的百分比用于存储自动索引
指定表空间总大小的百分比用于存储自动索引相关数据。如:指定 5%用于存 储自动索引
exec dbms_auto_index.configure('auto_index_space_budget','5') ;
set linesize 200
col parameter_name format a40
col parameter_value format a20
col last_modified format a20
col modified_by format a20
select * from dba_auto_index_config ;
通过 dbms_auto_index 包中的 report_activity 和 report_last_activity 两个存储过程来生成报告。
1、使用默认配置生成报告
declare
report clob := null ;
begin
report := dbms_auto_index.report_activity() ;
dbms_output.put_line(report) ;
end ;
2、生成最后一次自动化索引操作的报告
set serveroutput on
declare
report clob := null ;
begin
report := dbms_auto_index.report_last_activity() ;
dbms_output.put_line(report) ;
end ;
dbms_auto_index.report_activity 和 report_last_activity 说明
dbms_auto_index.report_activity (
activity_start |
in timestamp with time zone default systimestamp - 1, |
activity_end |
in timestamp with time zone default systimestamp, |
type |
in varchar2 default 'text', |
section |
in varchar2 default 'all', |
level |
in varchar2 default 'typical') |
return clob ;
dbms_auto_index.report_last_activity (
type in varchar2 default 'text',
section in varchar2 default 'all',
level in varchar2 default 'typical')
return clob ;
说明如下:
tpe:可选值 text、html、xml
section:可选值:summary, index_details, verification_details, errors, all。可通过+号选择多个值,-号去掉某个值。
level:可选值:basic, typical, all。
SQL> select view_name from dba_views where view_name like
'DBA_AUTO_INDEX%' order by 1 ;
view_name
---------------------------
dba_auto_index_config
dba_auto_index_executions
dba_auto_index_ind_actions
dba_auto_index_sql_actions
dba_auto_index_statistics
dba_auto_index_verifications
视图 |
说明 |
dba_auto_index_config |
显示自动化索引当前的配置 |
dba_indexes all_indexes user_indexes |
AUTO 列显示该索引是否是自动化索引 |
SQL> select banner_full from v$version ;
set linesize 200
col parameter_name format a40
col parameter_value format a20
col last_modified format a20
col modified_by format a20
select * from dba_auto_index_config ;
SQL> exec dbms_auto_index.configure('auto_index_mode','implement') ; ERROR at line 1:
ORA-40216: feature not supported
ORA-06512: at "SYS.DBMS_SYS_ERROR", line 79
ORA-06512: at "SYS.DBMS_AUTO_INDEX_INTERNAL", line 9180 ORA-06512: at "SYS.DBMS_AUTO_INDEX", line 283 ORA-06512: at line 1
alter system set "_exadata_feature_on"=true scope=spfile ;
shutdown immediate
startup
show parameter "_exadata_feature_on"
SQL> exec dbms_auto_index.configure('auto_index_mode','implement') ;
SQL> select * from dba_auto_index_config ;
SQL> alter session set container=pdb1 ;
SQL> startup
col parameter_name for a40
col parameter_value for a40
col last_modified for a40
col modified_by for a40
set linesize 200
select * from dba_auto_index_config ;
SQL>exec dbms_auto_index.configure('auto_index_mode','implement') ;
SQL> select * from dba_auto_index_config ;
创建用户及授权
create user test identified by 123456 ;
grant dba to test ;
连接用户
conn test/[email protected]:1521/pdb1
show user
create table test as select * from dba_objects ;
insert into test select* from test ;
insert into test select* from test ;
update test set object_id=rownum;
commit ;
执行测试 SQL
declare
a varchar2(2000) := '' ;
begin
for x in 1.. 10000 loop
select object_name into a from test.test where object_id=x ; end loop ;
end ;
/
等 15 分钟后
col execution_name for a50
col error_message for a50
select * from dba_auto_index_executions ;
select * from dba_auto_index_statistics where
execution_name='SYS_AI_2021-02-10/23:53:27' ;
如没有使用自动化索引,再次执行以下测试 SQL
declare
a varchar2(2000) := '' ;
begin
for x in 1.. 10000 loop
select object_name into a from test.test where object_id=x ; end loop ;
end ;
/
等 15 分钟后