Oracle unusable index 與unvisible index


可見性

索引的可見性(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,或者刪除。 不可見索引,是對於我們預期的一種難途徑。

可用性

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM