Oracle 索引的可見與隱藏(visible/invisible)
官方文件:Making an Index Invisible
An invisible index is ignored by the optimizer unless you explicitly set the OPTIMIZER_USE_INVISIBLE_INDEXES initialization parameter to TRUE at the session or system level. Making an index invisible is an alternative to making it unusable or dropping it. You cannot make an individual index partition invisible. Attempting to do so produces an error.
解釋:一個不可見的索引在最佳化器中被忽視,除非你主動地在會話或系統級別中設定OPTIMIZER_USE_INVISIBLE_INDEXES初始化引數為TRUE。標記不可見索引可以替代不可用索引或刪除索引。你不能讓分割槽索引不可見。試圖這麼做會產生一個錯誤。
測試:
1. 建立測試表ti,根據dba_objects表。
scott@ORCL>create table ti as select * from dba_objects;
Table created.
scott@ORCL>select count(*) from ti;
COUNT(*)
----------
72799
|
2. 根據object_id列建立索引ind_ti
scott@ORCL>create index ind_ti on ti(object_id);
Index created.
|
3. 調整為檢視執行計劃
scott@ORCL>set autot trace exp
|
4. 測試索引是否生效被使用,結果索引被正常應用
scott@ORCL>select * from ti where object_id=20;
Execution Plan
----------------------------------------------------------
Plan hash value: 1655810896
--------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
--------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 207 | 2 (0)| 00:00:01 |
| 1 | TABLE ACCESS BY INDEX ROWID| TI | 1 | 207 | 2 (0)| 00:00:01 |
|* 2 | INDEX RANGE SCAN | IND_TI | 1 | | 1 (0)| 00:00:01 |
--------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
2 - access("OBJECT_ID"=20)
Note
-----
- dynamic sampling used for this statement (level=2)
|
5. 將ind_ti索引改為不可見
scott@ORCL>alter index ind_ti invisible;
|
6. 再次測試時,索引沒有被使用
scott@ORCL>select * from ti where object_id=20;
Execution Plan
----------------------------------------------------------
Plan hash value: 798420002
--------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
--------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 12 | 2484 | 291 (1)| 00:00:04 |
|* 1 | TABLE ACCESS FULL| TI | 12 | 2484 | 291 (1)| 00:00:04 |
--------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
1 - filter("OBJECT_ID"=20)
Note
-----
- dynamic sampling used for this statement (level=2)
|
7. 資料修改
scott@ORCL>insert into ti select * from ti;
72799 rows created.
scott@ORCL>insert into ti select * from ti;
145598 rows created.
scott@ORCL>select count(*) from ti;
COUNT(*)
----------
291196
|
8. 將索引改為可見狀態
scott@ORCL>alter index ind_ti visible;
Index altered.
|
9. 測試索引是否生效被使用,結果索引被正常應用
scott@ORCL>set autot trace exp
scott@ORCL>select * from ti where object_id=20;
Execution Plan
----------------------------------------------------------
Plan hash value: 1655810896
--------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
--------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 4 | 828 | 2 (0)| 00:00:01 |
| 1 | TABLE ACCESS BY INDEX ROWID| TI | 4 | 828 | 2 (0)| 00:00:01 |
|* 2 | INDEX RANGE SCAN | IND_TI | 4 | | 1 (0)| 00:00:01 |
--------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
2 - access("OBJECT_ID"=20)
Note
-----
- dynamic sampling used for this statement (level=2)
|
總結:早期版本沒有該特性,如果想去掉索引進行測試,之後又想恢復索引,只能先將索引置為不能用或刪除。過後在rebuild index,需要花費不少時間,而且有可能會影響到業務工作效率。學習了該特性對以後最佳化SQL測試有很大幫助。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/30633755/viewspace-1871649/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Oracle之不可見索引(invisible indexes)Oracle索引Index
- 隱藏索引索引
- Oracle資料庫中的不可見索引 invisible indexOracle資料庫索引Index
- MySQL 8.0 中的索引可以隱藏了!MySql索引
- 11g新特性: 索引不可見(Index Invisible)索引Index
- Oracle 隱藏列Oracle
- mysql8.0新特性--隱藏索引MySql索引
- 函式索引產生隱藏列函式索引
- MySQL 索引機制背後的隱藏之道MySql索引
- jquery判斷元素是否可見隱藏程式碼簡單介紹jQuery
- 牛逼!MySQL 8.0 中的索引可以隱藏了…MySql索引
- oracle小知識點7--索引的unusable,disable,invisibleOracle索引
- Oracle 隱藏引數使用Oracle
- c++中的隱藏及過載、重寫與隱藏的區別C++
- 眼見為實,看看MySQL中的隱藏列!MySql
- oracle invisible index與unusable index的區別OracleIndex
- 檢視Oracle隱藏引數的SQLOracleSQL
- Oracle引數-隱藏引數Oracle
- 檢視oracle隱藏引數Oracle
- MAC如何顯示隱藏檔案和隱藏隱藏檔案的命令Mac
- jQuery動畫的顯示與隱藏效果jQuery動畫
- jQuery動畫的顯示與隱藏效果!jQuery動畫
- NavigationBar的隱藏與顯示Navigation
- 隱藏JqueryMobile中的Header與FooterjQueryHeader
- linux檔案系統的隱藏許可權Linux
- Oracle之不可見索引Oracle索引
- oracle隱藏引數的檢視和使用Oracle
- Oracle like、不等於、隱式轉換走索引與不走索引情況Oracle索引
- 【索引】Oracle之不可見索引和虛擬索引的比對索引Oracle
- 隱藏資料夾怎麼取消隱藏 關閉隱藏檔案的辦法
- 用js控制div的顯示與隱藏JS
- 不可見索引(invisible index)在表DML操作過程中依然被維護索引Index
- 隱藏nginx、apache與php版本號NginxApachePHP
- Android開發之--visibility屬性VISIBLE、INVISIBLE、GONE的區別AndroidGo
- Mac下顯示和隱藏隱藏檔案的命令Mac
- 隱藏ip
- OSX中隱藏和顯示[隱藏檔案]的命令列命令列
- JavaScript 設定div顯示與隱藏JavaScript