1. 程式人生 > 實用技巧 >Oracle Database 19c中的自動索引

Oracle Database 19c中的自動索引

Oracle Database 19c中的自動索引

1、它能做什麼

自動索引功能執行以下操作。

  • 根據表列使用情況確定潛在的自動索引。文件稱這些為“候選索引(candidate indexes)”。

  • 將自動索引建立為不可見索引,因此不會在執行計劃中使用它們。索引名稱包括“SYS_AI”字首。

  • 根據SQL語句測試不可見的自動索引,以確保它們能提高效能。如果它們導致效能提高,則可以它們可見。如果效能未得到改善,則相關的自動索引將標記為不可用,稍後將被刪除。針對失敗的自動索引測試的SQL語句被列入黑名單,因此將來不會考慮將它們用於自動索引。第一次對資料庫執行SQL時,優化程式不會考慮自動索引。

  • 刪除未使用的索引。

2、先決條件

通過設定初始化引數“_exadata_feature_on=true”進行測試。注:請不要在生產系統中測試。

1 2 3 4 5 6 7 8 9 10 11 exportORACLE_SID=cdb1 exportORAENV_ASK=NO .oraenv exportORAENV_ASK=YES sqlplus/assysdba<<EOF altersystem set"_exadata_feature_on"=truescope=spfile; shutdownimmediate; startup;
exit; EOF

3、配置

使用DBMS_AUTO_INDEX包來管理自動索引特性。下面描述了基本管理。

3.1顯示配置

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 CDB_AUTO_INDEX_CONFIG檢視顯示當前的自動索引配置。 COLUMNparameter_nameFORMATA40 COLUMNparameter_valueFORMATA15 SELECTcon_id,parameter_name,parameter_value FROM cdb_auto_index_config
ORDERBY1,2; CON_IDPARAMETER_NAMEPARAMETER_VALUE ----------------------------------------------------------------- 1AUTO_INDEX_COMPRESSIONOFF 1AUTO_INDEX_DEFAULT_TABLESPACE 1AUTO_INDEX_MODEOFF 1AUTO_INDEX_REPORT_RETENTION31 1AUTO_INDEX_RETENTION_FOR_AUTO373 1AUTO_INDEX_RETENTION_FOR_MANUAL 1AUTO_INDEX_SCHEMA 1AUTO_INDEX_SPACE_BUDGET50 3AUTO_INDEX_COMPRESSIONOFF 3AUTO_INDEX_DEFAULT_TABLESPACE 3AUTO_INDEX_MODEOFF 3AUTO_INDEX_REPORT_RETENTION31 3AUTO_INDEX_RETENTION_FOR_AUTO373 3AUTO_INDEX_RETENTION_FOR_MANUAL 3AUTO_INDEX_SCHEMA 3AUTO_INDEX_SPACE_BUDGET50 SQL>

如果我們切換到使用者定義的可插拔資料庫,我們只獲取該容器的值。

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 ALTERSESSIONSETCONTAINER=pdb1; COLUMNparameter_nameFORMATA40 COLUMNparameter_valueFORMATA15 SELECTcon_id,parameter_name,parameter_value FROM cdb_auto_index_config ORDERBY1,2; CON_IDPARAMETER_NAMEPARAMETER_VALUE ----------------------------------------------------------------- 3AUTO_INDEX_COMPRESSIONOFF 3AUTO_INDEX_DEFAULT_TABLESPACE 3AUTO_INDEX_MODEOFF 3AUTO_INDEX_REPORT_RETENTION31 3AUTO_INDEX_RETENTION_FOR_AUTO373 3AUTO_INDEX_RETENTION_FOR_MANUAL 3AUTO_INDEX_SCHEMA 3AUTO_INDEX_SPACE_BUDGET50 SQL>

3.2啟用/禁用自動索引

使用DBMS_AUTO_INDEX包的CONFIGURE儲存過程配置自動索引。

使用AUTO_INDEX_MODE屬性控制用於自動索引的開關,該屬性具有以下允許值:

  • IMPLEMENT:開啟自動索引。提高效能的新索引可見並可供優化程式使用。

  • REPORT ONLY:開啟自動索引,但新索引仍然不可見。

  • OFF:關閉自動索引。

模式之間切換的命令示例如下:

1 2 3 EXECDBMS_AUTO_INDEX.CONFIGURE('AUTO_INDEX_MODE','IMPLEMENT'); EXECDBMS_AUTO_INDEX.CONFIGURE('AUTO_INDEX_MODE','REPORTONLY'); EXECDBMS_AUTO_INDEX.CONFIGURE('AUTO_INDEX_MODE','OFF');

3.3自動索引的表空間

預設情況下,自動索引是在預設的永久表空間中建立的。如果這是不可接受的,您可以使用AUTO_INDEX_DEFAULT_TABLESPACE屬性指定一個表空間來儲存它們。下面我們建立一個表空間來儲存自動索引,並相應地設定屬性。

1 2 3 4 5 ALTERSESSIONSETCONTAINER=pdb1; CREATETABLESPACEAUTO_INDEXES_TS DATAFILESIZE100M AUTOEXTENDONNEXT100M; EXECDBMS_AUTO_INDEX.CONFIGURE('AUTO_INDEX_DEFAULT_TABLESPACE','AUTO_INDEXES_TS');

如果要設定使用預設永久表空間,可以設定為NULL,如下命令所示:

1 EXECDBMS_AUTO_INDEX.CONFIGURE('AUTO_INDEX_DEFAULT_TABLESPACE',NULL);

3.4模式級(Schema-Level)控制

一旦啟用了自動索引,在嘗試識別候選索引時會考慮所有模式。您可以使用AUTO_INDEX_SCHEMA屬性更改預設行為,該屬性允許您維護包含/排除列表。

如果ALLOW引數設定為true,則指定的模式(schema)將新增到包含列表中。注意:它構建了一個包含模式的謂詞。

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 EXECDBMS_AUTO_INDEX.CONFIGURE('AUTO_INDEX_SCHEMA','TEST',allow=>TRUE); EXECDBMS_AUTO_INDEX.CONFIGURE('AUTO_INDEX_SCHEMA','TEST2',allow=>TRUE); COLUMNparameter_nameFORMATA40 COLUMNparameter_valueFORMATA15 SELECTcon_id,parameter_name,parameter_value FROM cdb_auto_index_config ORDERBY1,2; CON_IDPARAMETER_NAMEPARAMETER_VALUE ------------------------------------------------------------------------------------------ 3AUTO_INDEX_COMPRESSIONOFF 3AUTO_INDEX_DEFAULT_TABLESPACEAUTO_INDEXES_TS 3AUTO_INDEX_MODEIMPLEMENT 3AUTO_INDEX_REPORT_RETENTION31 3AUTO_INDEX_RETENTION_FOR_AUTO373 3AUTO_INDEX_RETENTION_FOR_MANUAL 3AUTO_INDEX_SCHEMAschemaIN(TEST,TEST2) 3AUTO_INDEX_SPACE_BUDGET50 SQL>

可以使用NULL引數值消除包含列表,如下所示:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 EXECDBMS_AUTO_INDEX.CONFIGURE('AUTO_INDEX_SCHEMA',NULL,allow=>TRUE); COLUMNparameter_nameFORMATA40 COLUMNparameter_valueFORMATA15 SELECTcon_id,parameter_name,parameter_value FROM cdb_auto_index_config ORDERBY1,2; CON_IDPARAMETER_NAMEPARAMETER_VALUE ------------------------------------------------------------------------------------------ 3AUTO_INDEX_COMPRESSIONOFF 3AUTO_INDEX_DEFAULT_TABLESPACEAUTO_INDEXES_TS 3AUTO_INDEX_MODEIMPLEMENT 3AUTO_INDEX_REPORT_RETENTION31 3AUTO_INDEX_RETENTION_FOR_AUTO373 3AUTO_INDEX_RETENTION_FOR_MANUAL 3AUTO_INDEX_SCHEMA 3AUTO_INDEX_SPACE_BUDGET50 SQL>

如果ALLOW引數設定為FALSE,則指定的模式將新增到排除列表中。

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 EXECDBMS_AUTO_INDEX.CONFIGURE('AUTO_INDEX_SCHEMA','TEST',allow=>FALSE); EXECDBMS_AUTO_INDEX.CONFIGURE('AUTO_INDEX_SCHEMA','TEST2',allow=>FALSE); COLUMNparameter_nameFORMATA40 COLUMNparameter_valueFORMATA15 SELECTcon_id,parameter_name,parameter_value FROM cdb_auto_index_config ORDERBY1,2; CON_IDPARAMETER_NAMEPARAMETER_VALUE ------------------------------------------------------------------------------------------ 3AUTO_INDEX_COMPRESSIONOFF 3AUTO_INDEX_DEFAULT_TABLESPACEAUTO_INDEXES_TS 3AUTO_INDEX_MODEIMPLEMENT 3AUTO_INDEX_REPORT_RETENTION31 3AUTO_INDEX_RETENTION_FOR_AUTO373 3AUTO_INDEX_RETENTION_FOR_MANUAL 3AUTO_INDEX_SCHEMAschemaNOTIN(TEST,TEST2) 3AUTO_INDEX_SPACE_BUDGET50 SQL>

可以使用NULL引數值清除排除列表。

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 EXECDBMS_AUTO_INDEX.CONFIGURE('AUTO_INDEX_SCHEMA',NULL,allow=>FALSE); COLUMNparameter_nameFORMATA40 COLUMNparameter_valueFORMATA15 SELECTcon_id,parameter_name,parameter_value FROMcdb_auto_index_config ORDERBY1,2; CON_IDPARAMETER_NAMEPARAMETER_VALUE ------------------------------------------------------------------------------------------ 3AUTO_INDEX_COMPRESSIONOFF 3AUTO_INDEX_DEFAULT_TABLESPACEAUTO_INDEXES_TS 3AUTO_INDEX_MODEIMPLEMENT 3AUTO_INDEX_REPORT_RETENTION31 3AUTO_INDEX_RETENTION_FOR_AUTO373 3AUTO_INDEX_RETENTION_FOR_MANUAL 3AUTO_INDEX_SCHEMA 3AUTO_INDEX_SPACE_BUDGET50 SQL>

4、其它配置

您可能希望考慮其他引數,這些都在此詳細說明。

  • AUTO_INDEX_COMPRESSION:據推測用於控制壓縮程度。預設為“OFF”

  • AUTO_INDEX_REPORT_RETENTION:自動索引日誌的保留期。預設31天。

  • AUTO_INDEX_RETENTION_FOR_AUTO:未使用的自動索引的保留期。預設373天。

  • AUTO_INDEX_RETENTION_FOR_MANUAL:未使用的手動建立索引的保留期。設定為NULL時,不考慮手動建立的索引。預設為NULL

  • AUTO_INDEX_SPACE_BUDGET:用於自動索引儲存的預設永久表空間的百分比。使用AUTO_INDEX_DEFAULT_TABLESPACE引數指定自定義表空間時,將忽略此引數。

5、刪除二級索引

在做這個之前,請仔細考慮,測試,測試,測試!

1 2 3 4 5 6 7 8 如果您感覺特別勇敢,DROP_SECONDARY_INDEXES過程將刪除除用於約束的索引之外的所有索引。這可以在表、模式(Schema)、資料庫級別完成。 --表級別 EXECDBMS_AUTO_INDEX.drop_secondary_indexes('MY_SCHEMA', 'MY_TABLE'); --模式(Schema)級別 EXECDBMS_AUTO_INDEX.drop_secondary_indexes('MY_SCHEMA'); --資料庫級別 EXECDBMS_AUTO_INDEX.drop_secondary_indexes;

6、檢視

有幾個與自動索引功能相關的檢視,如下所示:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 SELECTview_name FROM dba_views WHEREview_nameLIKE'DBA_AUTO_INDEX%' ORDERBY1; 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 SQL>

此外,{CDB|DBA|ALL|USER}_INDEXES 檢視包含AUTO列,該列指示索引是否由自動索引功能建立。

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 COLUMNownerFORMATA30 COLUMNindex_nameFORMATA30 COLUMNtable_ownerFORMATA30 COLUMNtable_nameFORMATA30 SELECTowner, index_name, index_type, table_owner, table_name table_type FROM dba_indexes WHEREauto='YES' ORDERBYowner,index_name;

7、活動報告

DBMS_AUTO_INDEX包中包含兩個報告功能。

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 DBMS_AUTO_INDEX.REPORT_ACTIVITY( activity_startINTIMESTAMP WITHTIMEZONE DEFAULTSYSTIMESTAMP-1, activity_endINTIMESTAMPWITHTIMEZONE DEFAULTSYSTIMESTAMP, typeINVARCHAR2 DEFAULT'TEXT', section INVARCHAR2 DEFAULT'ALL', level INVARCHAR2 DEFAULT'TYPICAL') RETURNCLOB; DBMS_AUTO_INDEX.REPORT_LAST_ACTIVITY( typeINVARCHAR2DEFAULT'TEXT', sectionINVARCHAR2DEFAULT'ALL', levelINVARCHAR2DEFAULT'TYPICAL') RETURNCLOB;

REPORT_ACTIVITY函式允許您顯示指定時間段內的活動,預設為最後一天。REPORT_LAST_ACTIVITY函式報告上次自動索引操作。兩者都允許您使用以下引數定製輸出。

  • TYPE:允許值(TEXT,HTML,XML)。

  • SECTION:允許值(SUMMARY,INDEX_DETAILS,VERIFICATION_DETAILS,ERRORS,ALL)。您還可以使用帶有“+”和“-”字元的組合來指示是否應包含或排除某些內容。例如'SUMMARY + ERRORS'或'ALL -ERRORS'

  • LEVEL:允許值(BASIC,TYPICAL,ALL)。

SQL中使用這些函式的一些示例如下所示。注意引用LEVEL引數。在SQL呼叫中使用它時,這是必要的,因此這不是對LEVEL偽列的引用。

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 SETLONG1000000PAGESIZE0 --過去24小時的預設TEXT報告。 SELECTDBMS_AUTO_INDEX.report_activity()FROMdual; --最新活動的預設TEXT報告。 SELECTDBMS_AUTO_INDEX.report_last_activity()FROMdual; --前天的HTML報告。 SELECTDBMS_AUTO_INDEX.report_activity( activity_start=>SYSTIMESTAMP-2, activity_end=>SYSTIMESTAMP-1, type=>'HTML') FROMdual; --最新活動的HTML報告。 SELECTDBMS_AUTO_INDEX.report_last_activity( type=>'HTML') FROMdual; --前天的XML報告包含所有資訊。 SELECTDBMS_AUTO_INDEX.report_activity( activity_start=>SYSTIMESTAMP-2, activity_end=>SYSTIMESTAMP-1, type=>'XML', section=>'ALL', "LEVEL"=>'ALL') FROMdual; --包含所有資訊的最新活動的XML報告。 SELECTDBMS_AUTO_INDEX.report_last_activity( type=>'HTML', section=>'ALL', "LEVEL"=>'ALL') FROMdual; SETPAGESIZE14

以下是在建立任何索引之前預設活動報告的輸出示例。

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 SELECTDBMS_AUTO_INDEX.report_activity() FROMdual; GENERALINFORMATION ------------------------------------------------------------------------------- Activity start: 03-JUN-201921:59:21 Activity end: 04-JUN-201921:59:21 Executionscompleted: 2 Executionsinterrupted: Executions withfatal error: ------------------------------------------------------------------------------- SUMMARY(AUTOINDEXES) ------------------------------------------------------------------------------- Indexcandidates: Indexescreated: Spaceused: 0B Indexesdropped: SQLstatementsverified: SQLstatementsimproved: SQLplanbaselinescreated: Overallimprovementfactor: 0x ------------------------------------------------------------------------------- SUMMARY(MANUALINDEXES) ------------------------------------------------------------------------------- Unusedindexes: Spaceused: 0B Unusableindexes: ------------------------------------------------------------------------------- ERRORS --------------------------------------------------------------------------------------------- Noerrorsfound. --------------------------------------------------------------------------------------------- SQL>