Oracle數據庫存在不可用索引性能問題
在實踐中ORACLE數據庫存在不可用索引會引發性能問題。
所謂的不可用索引,是指索引自身出了問題,不能被所有SQL使用到。這與因SQL寫法不當而無法使用索引的索引失效情況不同。
當索引變為不可用時,原本可以使用該索引的SQL都將無法使用該索引,只能選擇全表掃描或全分區掃描,這將導致SQL執行效率大幅下降。如果并發高一些,將會耗盡數據庫主機硬件資源,導致所有請求響應超時。
導致索引不可用的情況通常有:
1.當用truncate/drop/exchange 操作分區時,全局索引會失效。增加 update global indexes 參數,全局索引就不會失效了。
2.exchange的臨時表沒有索引,或者有索引,沒有用including indexes的關鍵字,會導致局部的索引失效,就是某個分區失效。
重建局部索引只能用alter index local_idx rebuild partition p1這樣的方式
3.分區表SPLIT的時候,如果MAX區中已經有記錄了,這個時候SPLIT就會導致有記錄的新增分區的局部索引失效!
4.對表執行move操作,將導致表上所有索引變為不可用。
5.sqlldr 如帶有 skip_index_maintenance=true 參數,數據導入時將不維護索引,會導致表上所有索引不可用。所以,在完成數據導入后,需重建表上所有索引。
通過檢查不可用索引,排查索引不可用的原因,修正存在缺陷的維護操作,避免生產事件的發生,只重建不可用索引,是遠遠不夠的。尤其小心不同日期同一時刻導致索引不可用的情況。
一旦出現不可用索引,就特別容易引發生產事故。所以,請特別重視,排查原因,消除隱患。
修復建議:
1.找出導致索引不可用的原因
可從Oracle alert日志中查找索引不可用的日志,根據時間點排查相關表的維護類操作,進而確定引發的原因。
ssh登陸oracle服務器上,查看日志命令:
cd /home/db/oracle/diag/rdbms/<庫名>/<實例名>/trace
grep -i -w 'unusable' -B2 -A2 alert_<實例名>.log
2.如果是全局分區索引,建議將索引刪掉后重建。對于本地分區索引,重建不可用索引分區或索引子分區。
參考SQL語句:
select * from user_indexes where status = 'UNUSABLE'; alter index <index_name> rebuild online;
select * from user_ind_partitions where status = 'UNUSABLE';
alter index <index_name> rebuild partition <partition_name> online;
select * from user_ind_subpartitions where status = 'UNUSABLE';
alter index <index_name> rebuild subpartition <subpartition_name> online;