Oracle 定期檢查意義不大的索引

maohaiqing0304發表於2015-01-08
 

標題: Oracle 定期檢查意義不大的索引

作者:lōττéry©版權所有[文章允許轉載,但必須以連結方式註明源地址,否則追究法律責任.]



註釋:
 您資料庫中某使用者下是否有一些這樣的索引
 1、索引欄位對應資料去重後就極少個不同值;
 2、初步設計加的索引,後續並沒有用到;
 等情況,這樣的索引對insert update delete都有影響;
 那我們怎麼找到這樣的索引和做清理呢?



  --SQl如下:    /*定期檢查ORACLE 意義不大的索引(也就是:索引的DISTINCT_KEYS??表總數極小)*/
  select i.table_name "表名",
       tcc.comments "表註釋",
       i.index_name "索引名",
       to_char(wm_concat(ucc.column_name)) "欄位名",
       to_char(wm_concat(ucc.comments)) "欄位註釋",
       max (distinct_keys) "distinct_keys", --(為0:欄位值都為空;為1:欄位值僅有一個值)
       max (t.num_rows) "表總量"
       --,t.last_analyzed "last_analyzed"
       --,round(i.distinct_keys / t.num_rows, 5) 比例
       --,i.index_type "索引型別"
  from user_indexes      i,
       user_tables       t,
       user_ind_columns  ic,
       user_tab_comments tcc,
       user_col_comments ucc
  where t.table_name = i.table_name
   and ucc.table_name = t.table_name
   and ic.index_name = i.index_name
   and tcc.table_name = t.table_name
   and ucc.column_name = ic.column_name
   and t.num_rows > 500 --過濾掉小表
   and nvl (t.num_rows, 0 ) != 0 --空:沒統計,0:沒資料
   and (i.distinct_keys /t.num_rows <0.001--distinct_keys索引去重值/t.num_rows表總數極小證明索引意義不大
       or distinct_keys <= 5 )
  group by i.table_name, tcc.comments, i.index_name;
    


  

   --用到的檢視          檢視註釋            用到的欄位                     註釋
     --USER_INDEXES       索引資訊             DISTINCT_KEYS                欄位去重值
     --USER_TABLES        表物件資訊           NUM_ROWS                     表最後一次統計總行數
     --USER_IND_COLUMNS   索引對應的表列資訊   COLUMN_NAME                  索引欄位
     --USER_TAB_COMMENTS  表註釋               COMMENTS                     表註釋 
     --USER_COL_COMMENTS  欄位註釋             COMMENTS                     欄位註釋
     --其實可以稍微完善下(表名字/註釋若多行只顯示一行,其他都顯示空,索引是組合索引 只顯示一行合併後的結果;)

 
    提示:
    透過如上sql 查到distinct_key<5,該索引就該確認是否有意義了[具體多大範圍自己定]
    sql結果發給開發確認後,就算開發人員說沒問題了可以刪索引了,也存在個別功能真的有用到啥的[如:hint等];
    所以在刪除索引前 最好做一個一段時間監控索引的使用情況;
    參考部落格:Oracle 以月為單位檢查索引的使用情況(郵件反饋)   /*參考部落格中儲存的表 確定好了,再放心的清理..*/ 
    部落格主要的意思就是定期將用到的索引insert到一個普通表,月底做下統計。確認真的沒有用過 就可以刪了..

    【源於本人筆記】 若有書寫錯誤,表達錯誤,請指正...


此條目發表在 SQL、SQL最佳化篇 分類目錄。將固定連線加入收藏夾。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/28602568/viewspace-1394700/,如需轉載,請註明出處,否則將追究法律責任。

相關文章