Oracle資料庫中的不可見索引 invisible index
Oracle11g開始,我們可以將索引設定為不可見索引,也可以叫隱藏索引。Oracle在對錶進行DML操作時仍然會維護不可見索引,但不會讓最佳化器選擇不可見索引。
不可見索引可以在以下場景使用:
1、在刪除索引之前,可以將器設定為不可見索引,如果後續需要可以將快速恢復。
2、在不影響現有程式和程式碼情況下,建立不可見索引。
以下時不可見索引的實驗:
--連線到CDB [oracle@]$ sqlplus / as sysdba SYS@HFXFCDB > show pdbs CON_ID CON_NAME OPEN MODE RESTRICTED ---------- ------------------------------ ---------- ---------- 2 PDB$SEED READ ONLY NO 3 XFPDB1 READ WRITE NO --切換到PDB:XFPDB1 SYS@HFXFCDB > alter session set container=XFPDB1; Session altered. --建立使用者hfxrf SYS@HFXFCDB > create user hfxf identified by hfxf; User created. --給使用者授權 SYS@HFXFCDB > grant resource,connect to hfxf; --建立使用者表空間hfxf_tbs SYS@HFXFCDB > create tablespace hfxf_tbs datafile '+DATA/xfpdb1/hfxf_tbs01.bdf' size 50m; Tablespace created. --建立索引表空間hfxf_tbs_inx SYS@HFXFCDB > create tablespace hfxf_tbs_inx datafile '+DATA/xfpdb1/hfxf_tbs_inx01.dbf' size 20m; Tablespace created. -透過以下命令驗證hfxf使用者的預設表空間 SYS@HFXFCDB > select USERNAME,DEFAULT_TABLESPACE from dba_users where username='HFXF'; USERNAME -------------------------------------------------------------------------------- DEFAULT_TABLESPACE ------------------------------ HFXF HFXF_TBS --使用hfxf使用者連線到xfpdb1中 SYS@HFXFCDB > conn hfxf/hfxf@xfpdb1 Connected. --建立cust表 HFXF@xfpdb1 > CREATE TABLE cust 2 (cust_id NUMBER 3 ,last_name VARCHAR2(30) 4 ,first_name VARCHAR2(30) 5 ); Table created. --向cust表中插入資料 HFXF@xfpdb1 > insert into cust values(7,'ACER','SCOTT'); insert into cust values(7,'ACER','SCOTT') * ERROR at line 1: ORA-01950: no privileges on tablespace 'HFXF_TBS' HFXF@xfpdb1 > insert into cust values(5,'STARK','JIM'); insert into cust values(5,'STARK','JIM') * ERROR at line 1: ORA-01950: no privileges on tablespace 'HFXF_TBS' HFXF@xfpdb1 > insert into cust values(3,'GREY','BOB'); insert into cust values(3,'GREY','BOB') * ERROR at line 1: ORA-01950: no privileges on tablespace 'HFXF_TBS' HFXF@xfpdb1 > insert into cust values(11,'KAHN','BRAD'); insert into cust values(11,'KAHN','BRAD') * ERROR at line 1: ORA-01950: no privileges on tablespace 'HFXF_TBS' HFXF@xfpdb1 > insert into cust values(21,'DEAN','ANN'); insert into cust values(21,'DEAN','ANN') * ERROR at line 1: ORA-01950: no privileges on tablespace 'HFXF_TBS' --hfxf使用者對錶空間HFXF_TBS的操作許可權不足,為使用者授權 HFXF@xfpdb1 > SYS@HFXFCDB > grant unlimited tablespace to hfxf; Grant succeeded. --在同一列建立多個索引 HFXF@xfpdb1 > create index cust_idx1 on cust(cust_id) tablespace hfxf_tbs_inx; Index created. HFXF@xfpdb1 > create index cust_idx2 on cust(cust_id) invisible tablespace hfxf_tbs_inx; create index cust_idx2 on cust(cust_id) invisible tablespace hfxf_tbs_inx * ERROR at line 1: ORA-01408: such column list already indexed 提示該列已經有索引 HFXF@xfpdb1 > create bitmap index cust_idx2 on cust(cust_id) invisible tablespace hfxf_tbs_inx; Index created. 驗證不可見索引 HFXF@xfpdb1 > select index_name,status,visibility from user_indexes; INDEX_NAME STATUS VISIBILIT --------------- -------- --------- CUST_IDX2 VALID INVISIBLE CUST_IDX1 VALID VISIBLE SYS@HFXFCDB > show parameter visible NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ optimizer_use_invisible_indexes boolean FALSE --透過企業自動跟蹤功能檢視執行計劃,驗證不可見索引是否在使用 HFXF@xfpdb1 > set autotrace trace explain HFXF@xfpdb1 > select cust_id from cust where cust_id=3; Execution Plan ---------------------------------------------------------- Plan hash value: 3472749082 ------------------------------------------------------------------------------ | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | ------------------------------------------------------------------------------ | 0 | SELECT STATEMENT | | 1 | 13 | 1 (0)| 00:00:01 | |* 1 | INDEX RANGE SCAN| CUST_IDX1 | 1 | 13 | 1 (0)| 00:00:01 | ------------------------------------------------------------------------------ Predicate Information (identified by operation id): --------------------------------------------------- 1 - access("CUST_ID"=3) Note ----- - dynamic statistics used: dynamic sampling (level=2) HFXF@xfpdb1 > HFXF@xfpdb1 > alter session set optimizer_use_invisible_indexes=true; Session altered. HFXF@xfpdb1 > select cust_id from cust where cust_id=3; Execution Plan ---------------------------------------------------------- Plan hash value: 4102297476 -------------------------------------------------------------------------------- ---------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | -------------------------------------------------------------------------------- ---------- | 0 | SELECT STATEMENT | | 1 | 13 | 1 (0)| 00:00:01 | | 1 | BITMAP CONVERSION TO ROWIDS | | 1 | 13 | 1 (0)| 00:00:01 | |* 2 | BITMAP INDEX FAST FULL SCAN| CUST_IDX2 | | | | | -------------------------------------------------------------------------------- ---------- Predicate Information (identified by operation id): --------------------------------------------------- 2 - filter("CUST_ID"=3) Note ----- - dynamic statistics used: dynamic sampling (level=2) HFXF@xfpdb1 > --使用invisible和visible子句進行可見/不可見索引的切換 HFXF@xfpdb1 > alter index cust_idx1 invisible; Index altered. HFXF@xfpdb1 > alter index cust_idx2 visible; Index altered. --透過以下SQL查詢索引的不可見索引 HFXF@xfpdb1 > select index_name,status,visibility from user_indexes; INDEX_NAME STATUS VISIBILIT --------------- -------- --------- CUST_IDX2 VALID VISIBLE CUST_IDX1 VALID INVISIBLE
小結:透過 optimizer_use_invisible_indexes引數可以控制最佳化器是否選擇隱藏索引,預設值時false 即預設情況下最佳化器不選擇
不可見索引。不可見索引是預設情況讓最佳化器看不到該索引,和其他型別索引一樣在下hi下DML操作時,不可見索引會佔用空間和資源。
-the end-**粗體**
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/28373936/viewspace-2920956/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 11g新特性: 索引不可見(Index Invisible)索引Index
- Oracle之不可見索引(invisible indexes)Oracle索引Index
- 不可見索引(invisible index)在表DML操作過程中依然被維護索引Index
- Oracle之不可見索引Oracle索引
- oracle invisible index與unusable index的區別OracleIndex
- 【索引】Oracle之不可見索引和虛擬索引的比對索引Oracle
- Oracle 索引的可見與隱藏(visible/invisible)Oracle索引
- 【INDEX】11g中利用不可見索引降低索引維護時對系統的衝擊Index索引
- 【INDEX】注意:不可見索引在表DML操作過程中依然被維護Index索引
- 【INDEX】Oracle 索引常見知識梳理IndexOracle索引
- oracle資料庫中索引空間的重用Oracle資料庫索引
- Oracle資料庫中索引的維護 ztOracle資料庫索引
- Oracle資料庫中索引的維護(zt)Oracle資料庫索引
- Oracle資料庫中索引的維護(轉)Oracle資料庫索引
- Invisible IndexIndex
- Oracle資料庫中索引的維護 (轉帖)Oracle資料庫索引
- Oracle中的虛擬列索引-nosegment indexOracle索引Index
- index , virtual , invisibleIndex
- 【INDEX】索引失效或者不可用 UNUSABLEIndex索引
- 8.0新特性-不可見索引索引
- oracle index索引原理OracleIndex索引
- SAP中的資料庫表索引資料庫索引
- GoldenGate 12.2 支援不可見列invisible column的複製Go
- 關於不可見索引的學習索引
- Oracle資料庫監控Index的使用情況Oracle資料庫Index
- 找到 MySQL 資料庫中的不良索引MySql資料庫索引
- 理解Sybase ASE資料庫中的索引資料庫索引
- Oracle資料庫索引管理規範Oracle資料庫索引
- 歸檔資料庫中的不可恢復操作資料庫
- oracle資料庫的ACFS圖形介面不可選擇Oracle資料庫
- ORACLE從資料庫中獲取已存在的TABPLESPACE及INDEX建立指令碼Oracle資料庫Index指令碼
- 資料庫索引中包含的資料結構有哪些資料庫索引資料結構
- Oracle資料庫索引使用及索引失效總結 轉Oracle資料庫索引
- Oracle索引分裂(Index Block Split)Oracle索引IndexBloC
- Oracle筆記 之 索引(index)Oracle筆記索引Index
- oracle index索引結構(一)OracleIndex索引
- oracle dml與索引index(一)Oracle索引Index
- Oracle資料庫開發——瞭解索引Oracle資料庫索引