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 TRUE alter 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都會去校驗索引可用性,如果索引不可用,就不能保證數據唯一性。