1.关于测试

创新互联建站是一家专业提供长清企业网站建设,专注与网站设计制作、成都网站建设、成都h5网站建设、小程序制作等业务。10年已为长清众多企业、政府机构等服务。创新互联专业网站设计公司优惠进行中。
最近oracle举办了一系列线上分享,其中一个19c的新特性是自动索引。自己在docker中测试了一下,失败。
[oracle@8aa96a41b58b ~]$ sqlplus / as sysdba
SQL*Plus: Release 19.0.0.0.0 - Production on Thu Feb 20 09:44:52 2020
Version 19.3.0.0.0
SQL> EXEC DBMS_AUTO_INDEX.CONFIGURE('AUTO_INDEX_MODE','IMPLEMENT');
BEGIN DBMS_AUTO_INDEX.CONFIGURE('AUTO_INDEX_MODE','IMPLEMENT'); END;
*
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
自动索引只能在exadata机器上配置。
Auto indexing will be allowed only in EXADATA systems, if not it will raise ORA-40216: feature not supported when we try it turn it on in non exadata systems.
ORA-40216 When Using Auto Index Feature (Doc ID 2570076.1)2.检查系统隐含参数
SELECT i.ksppinm name,
       i.ksppdesc description,
       CV.ksppstvl VALUE,
       CV.ksppstdf isdefault,
       DECODE(BITAND(CV.ksppstvf, 7),
              1,
              'MODIFIED',
              4,
              'SYSTEM_MOD',
              'FALSE') ismodified,
       DECODE(BITAND(CV.ksppstvf, 2), 2, 'TRUE', 'FALSE') isadjusted
  FROM sys.x$ksppi i, sys.x$ksppcv CV
 WHERE i.inst_id = USERENV('Instance')
   AND CV.inst_id = USERENV('Instance')
   AND i.indx = CV.indx
   AND i.ksppinm LIKE '%exadata%'/'
 ORDER BY REPLACE(i.ksppinm, '_', '');
其中有一项为:
NAME                     DESCRIPTION           VALUE      ISDEFAULT ISMODIFIED ISADJ
------------------------ --------------------- ---------- --------- ---------- -----
_exadata_feature_on      Exadata Feature On    FALSE      TRUE      FALSE      FALSE3.打开隐含参数
SQL> alter system set "_exadata_feature_on"=true scope=spfile;
SQL> shut immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup
ORACLE instance started.
Total System Global Area 1610609888 bytes
Fixed Size                  9135328 bytes
Variable Size             385875968 bytes
Database Buffers         1207959552 bytes
Redo Buffers                7639040 bytes
Database mounted.
Database opened.4.重新测试
注:以下测试脚本来自oracle在线分享。
重新打开自动索引配置,成功。
SQL> EXEC DBMS_AUTO_INDEX.CONFIGURE('AUTO_INDEX_MODE','IMPLEMENT');
PL/SQL procedure successfully completed.
启用自动索引有三个参数:
EXEC DBMS_AUTO_INDEX.CONFIGURE('AUTO_INDEX_MODE','IMPLEMENT|REPORT ONLY|OFF');
IMPLEMENT:启用自动索引并将创建后的索引设置为可见状态,优化器可使用该索引。
REPORT ONLY:启用,索引是不可见自动索引
OFF:关闭自动索引
cdb自动索引已启用:
SQL> COLUMN parameter_name FORMAT A40
SQL> COLUMN parameter_value FORMAT A20
SQL> SELECT con_id, parameter_name, parameter_value FROM cdb_auto_index_config;
    CON_ID PARAMETER_NAME                           PARAMETER_VALUE
---------- ---------------------------------------- --------------------
         1 AUTO_INDEX_COMPRESSION                   OFF
         1 AUTO_INDEX_DEFAULT_TABLESPACE
**         1 AUTO_INDEX_MODE                          IMPLEMENT**
         1 AUTO_INDEX_REPORT_RETENTION              31
         1 AUTO_INDEX_RETENTION_FOR_AUTO            373
         1 AUTO_INDEX_RETENTION_FOR_MANUAL
         1 AUTO_INDEX_SCHEMA
         1 AUTO_INDEX_SPACE_BUDGET                  50
         3 AUTO_INDEX_COMPRESSION                   OFF
         3 AUTO_INDEX_DEFAULT_TABLESPACE
         3 AUTO_INDEX_MODE                          OFF
    CON_ID PARAMETER_NAME                           PARAMETER_VALUE
---------- ---------------------------------------- --------------------
         3 AUTO_INDEX_REPORT_RETENTION              31
         3 AUTO_INDEX_RETENTION_FOR_AUTO            373
         3 AUTO_INDEX_RETENTION_FOR_MANUAL
         3 AUTO_INDEX_SCHEMA
         3 AUTO_INDEX_SPACE_BUDGET                  50启用pdb自动索引:
SQL> alter session set container=orclpdb;
Session altered.
SQL> EXEC DBMS_AUTO_INDEX.CONFIGURE('AUTO_INDEX_MODE','IMPLEMENT');
PL/SQL procedure successfully completed.
SQL> sELECT con_id, parameter_name, parameter_value FROM cdb_auto_index_config;
    CON_ID PARAMETER_NAME                           PARAMETER_VALUE
---------- ---------------------------------------- --------------------
         3 AUTO_INDEX_COMPRESSION                   OFF
         3 AUTO_INDEX_DEFAULT_TABLESPACE
   **      3 AUTO_INDEX_MODE                          IMPLEMENT**
         3 AUTO_INDEX_REPORT_RETENTION              31
         3 AUTO_INDEX_RETENTION_FOR_AUTO            373
         3 AUTO_INDEX_RETENTION_FOR_MANUAL
         3 AUTO_INDEX_SCHEMA
         3 AUTO_INDEX_SPACE_BUDGET                  50
8 rows selected.创建自动索引的存储空间
默认情况下,在数据库创建期间指定的永久表空间用于存储自动索引。是否配置可检查AUTO_INDEX_DEFAULT_TABLESPACE参数。
SQL> create tablespace tbs_auto datafile '/opt/oracle/oradata/ORCL/ORCLPDB/tbs_auto_ind01.dbf' size 100M;
Tablespace created.设置自动索引使用的默认表空间
SQL> EXEC DBMS_AUTO_INDEX.CONFIGURE('AUTO_INDEX_DEFAULT_TABLESPACE','tbs_auto');           
PL/SQL procedure successfully completed.
SQL> SELECT con_id, parameter_name, parameter_value FROM cdb_auto_index_config;
    CON_ID PARAMETER_NAME                           PARAMETER_VALUE
---------- ---------------------------------------- --------------------
         3 AUTO_INDEX_COMPRESSION                   OFF
         3 AUTO_INDEX_DEFAULT_TABLESPACE            TBS_AUTO
         3 AUTO_INDEX_MODE                          IMPLEMENT
         3 AUTO_INDEX_REPORT_RETENTION              31
         3 AUTO_INDEX_RETENTION_FOR_AUTO            373
         3 AUTO_INDEX_RETENTION_FOR_MANUAL
         3 AUTO_INDEX_SCHEMA
         3 AUTO_INDEX_SPACE_BUDGET                  50
保留系统默认使用以下存储过程
EXEC DBMS_AUTO_INDEX.CONFIGURE('AUTO_INDEX_DEFAULT_TABLESPACE',NULL);指定用户启用自动索引
在数据库中启用自动索引后,默认情况下,数据库中的所有用户都可以使用自动索引。
可以查看cdb_auto_index_config.AUTO_INDEX_SCHEMA字段查看不同的配置。
SH不能使用自动索引(AUTO_INDEX_SCHEMA=schema NOT IN (SH)):
EXEC DBMS_AUTO_INDEX.CONFIGURE('AUTO_INDEX_SCHEMA', 'SH', FALSE);
仅SH可以使用自动索引(AUTO_INDEX_SCHEMA=schema IN (SH)):
EXEC DBMS_AUTO_INDEX.CONFIGURE('AUTO_INDEX_SCHEMA', 'SH', TRUE);
数据库中的所有用户都可以使用自动索引:
EXEC DBMS_AUTO_INDEX.CONFIGURE('AUTO_INDEX_SCHEMA', NULL, TRUE);模拟自动索引创建:
SQL> create table hr.tab_auto as select rownum id,t.* from dba_objects t;
Table created.
SQL> declare
a varchar2(2000) := '';
  2    3  begin
  4  for x in 1.. 10000 loop
  5  select object_name into a from tab_auto where id=x;
  6  end loop;
  7  end;
  8  /
PL/SQL procedure successfully completed.
SQL> COLUMN task_name FORMAT A30
SQL> COLUMN advisor_name FORMAT A30
SQL> select task_name,advisor_name from dba_advisor_tasks where owner='SYS' ORDER BY TASK_ID;
TASK_NAME                      ADVISOR_NAME
------------------------------ ------------------------------
SYS_AUTO_SPM_EVOLVE_TASK       SPM Evolve Advisor
SYS_AI_SPM_EVOLVE_TASK         SPM Evolve Advisor       <<<
SYS_AI_VERIFY_TASK             SQL Performance Analyzer <<<与自动索引相关
SYS_AUTO_INDEX_TASK            SQL Access Advisor       <<<
AUTO_STATS_ADVISOR_TASK        Statistics Advisor
INDIVIDUAL_STATS_ADVISOR_TASK  Statistics Advisor过15分钟后查看索引
COLUMN OWNER FORMAT a10
col INDEX_TYPE format a10
col INDEX_NAME format a20
col TABLE_NAME format a20
col TABLE_OWNER format a10
SELECT OWNER,INDEX_TYPE,INDEX_NAME,TABLE_NAME,TABLE_OWNER FROM DBA_INDEXES WHERE AUTO='YES' ORDER BY OWNER,INDEX_NAME;
OWNER      INDEX_TYPE INDEX_NAME           TABLE_NAME           TABLE_OWNE
---------- ---------- -------------------- -------------------- ----------
HR         NORMAL     SYS_AI_8abjpspc3b08n TAB_AUTO             HR查看执行计划
SQL> select count(*) from tab_auto where id=100;  
  COUNT(*)
----------
         1
SQL> select * from table(dbms_xplan.display_cursor(format=>'TYPICAL'));
PLAN_TABLE_OUTPUT
-----------------------------------------------------------------------------------------
SQL_ID  8fp2w8rwapnbz, child number 0
-------------------------------------
select count(*) from tab_auto where id=100
Plan hash value: 896819007
------------------------------------------------------------------------------------------
| Id  | Operation         | Name                 | Rows  | Bytes | Cost (%CPU)| Time     |
------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |                      |       |       |     1 (100)|          |
|   1 |  SORT AGGREGATE   |                      |     1 |     5 |            |          |
|*  2 |   INDEX RANGE SCAN| SYS_AI_8abjpspc3b08n |     1 |     5 |     1   (0)| 00:00:01 |
------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
   2 - access("ID"=100)
使用了新创建的自动索引。指定未使用的自动索引的保留期限
使用AUTO_INDEX_RETENTION_FOR_AUTO配置未使用的自动索引保留在数据库中的期限。在指定的保留期限后,将删除未使用的自动索引。
注意:默认情况下,未使用的自动索引将在373天后删除。
以下语句将未使用的自动索引的保留期限设置为90天。
EXEC DBMS_AUTO_INDEX.CONFIGURE('AUTO_INDEX_RETENTION_FOR_AUTO', '90');
以下语句将自动索引的保留期重置为默认值373天。
EXEC DBMS_AUTO_INDEX.CONFIGURE('AUTO_INDEX_RETENTION_FOR_AUTO', NULL);生成自动索引报告
您可以使用软件包的REPORT_ACTIVITY和REPORT_LAST_ACTIVITY功能在Oracle数据库中生成与自动索引操作有关的报告DBMS_AUTO_INDEX。
-- 过去24小时内自动索引操作的典型信息,文本。
SELECT DBMS_AUTO_INDEX.report_activity()  FROM dual;
-- 最新活动的默认TEXT报告。
SELECT DBMS_AUTO_INDEX.report_last_activity() FROM dual;
-- 指定时间段的HTML报告。
SELECT DBMS_AUTO_INDEX.report_activity(activity_start =>TO_TIMESTAMP('2018-11-01', 'YYYY-MM-DD'),activity_end => TO_TIMESTAMP('2018-11-05', 'YYYY-MM-DD'),,type => 'HTML') FROM   dual;
也可以使用activity_start =>TIMESTAMP - N
-- 最新活动的HTML报告。
SELECT DBMS_AUTO_INDEX.report_last_activity( type => 'HTML') FROM   dual;
---最新活动的HTML报告。包括最新活动自动索引操作的摘要,索引详细信息和错误信息
DBMS_AUTO_INDEX.REPORT_LAST_ACTIVITY(type    => 'HTML',section => 'SUMMARY +INDEX_DETAILS +ERRORS',level   => 'BASIC');