標籤:hsi 之間 維護 cells created index str visible acl
1
可見度
索引的可見度(visibility)指的是該索引是否對CBO最佳化器可見,即CBO最佳化器在產生執行計畫的時候是否考慮該索引,可以看作是索引的一個屬性。如果一個索引可見度屬性為:invisible. 預設情況下CBO最佳化器產生執行計畫的時候,不再考慮該索引,僅此而已。與可見索引一樣,執行DML操作時,資料庫會相應維護索引的資料。但是對於local 索引,我們不能單獨為某個分區 設定不可見屬性,只能對整個索引設定不可見屬性。
- 設定索引可見度 不可見屬性,可以在建立索引時指定,也可以後期調整。
-- 建立索引時指定不可見屬性create index index_name on table_name(column_list) invisible;-- 後期調整可見度alter index index_name invisible;alter index index_name visible;
- 相關參數 optimizer_use_invisible_indexes 此參數可以控制最佳化器產生執行計畫時,是否考慮使用invisible index. 參數值為bool類型,當設定為true時,CBO會考慮使用invisible index. 預設為false. 此參數可以在會話或者系統全域或者執行個體層級進行設定。
SQL> select isses_modifiable,issys_modifiable,isinstance_modifiable from v$parameter where name=‘optimizer_use_invisible_indexes‘ISSES ISSYS_MOD ISINS----- --------- -----TRUE IMMEDIATE TRUEalter session set optimizer_use_invisible_indexes=true;alter system set optimizer_use_invisible_indexes=true sid=‘*‘ scope=both;
- 作用 在進行SQL最佳化時,不明確一個索引的建立或者刪除對系統是否有影響,此時,我們可以先將索引設定為inbisible狀態,然後,進行測試觀察,如果與預期一致,再將索引設定主visible,或者刪除。 不可見索引,是對於我們預期的一種難途徑。
2
可用性
索引可用性(usable),正常情況下,索引都是可用的。當索引不可用(unusable)時, Oracle 內部會把該索引中繼資料(即建立語句包含的基本資料)與真實物理資料之間的對應關係撕裂,相關資料區塊可被重用。索引段是否已建立 (dba_indexes.segment_created)這一屬性,會變為no(正常情況下,應為yes). unusable索引,想要被重新使用,只有一種方法: rebuild. 當然還可以先drop 再create.
- 一般情況下,CBO不考慮使用unusable狀態的索引,包含分區表。
- 當索引不可用時,Oracle 清除索引資料,並且不再維護
- 本地索引中,可以設定某個分區的索引為unusable。
- 相關參數 skip_unusable_indexes
| 參數作用 |
控制對unusable 的非唯一索引,dml操作時是否維護索引資料 |
| 參數值 |
true | false |
| |
當參數設定為true時(預設),oracle對索引資料的維護及CBO最佳化器都不會考慮該索引。 |
| |
當參數設定為false時,DML操作及CBO產生執行計畫時都會考慮該索引。一旦與unusable索引相關的操作都會失敗。會話報錯退出。 |
-
note
-
如果是唯一索引,DML時,oracle都會去校正索引可用性,如果索引不可用,就不能保證資料唯一性。
Oracle unusable index 與unvisible index