oracle11g分區中的兩大陷阱

如何使用Oracle分區功能?sql

1.個別場景不能從根本上提升查詢速度

在Oracle10g時不支持自動生成分區,技術人員都是手動建立一年或者半年的分區或者當超過限制時把數據都load到最大值分區,可是一年半年事後要麼出現數據沒法插入或者某個分區數據劇增,這個時候出現了Oracle11g的自動分區功能,可是自動分區名稱不能人爲設置。若是說數據量過大或者出現跨分區查詢會出現性能問題。數據庫

舉個栗子:線上有一個日誌儲存系統,天天大概存儲1000W左右的數據,支持分頁排序而且按照日期查詢功能(若是不排序,這個數據量對於Oracle是小ks)因而咱們採用了分區+覆蓋索引(若是想進一步瞭解.....)查詢的的功能,性能稍微提高。可是一段時間後發現仍是拖死系統。(由於這就是CAP問題,想從根本上解決問題,請建議公司採用nosql(habase、ELK)實現)。session

若是有這樣一種這樣場景,工資小於等於5000,大於5000而且小於等於12000,大於12000而且小於25000,大於等於25000分別按照這些工資級別建立分區則很是高效,由於能夠指定分區進行查詢( select * from TBL_OPR_CNT partition(5000_part);),由於指定分區查詢,效率直接提高。nosql

由此得知,關係數據庫效率高低,在於咱們如何發揮它的長處。性能

2. 手動對錶進行move操做,或者刪除表分區會致使索引失效

在實際線上環境,經常當發現性能出現問題時,這個時候才採起分區的解決方案,可是分區表通常都是全局索引,而後直接在原表採起分區功能,用了一段時間產生了歷史分區數據,而後刪除了其中一部分歷史分區,發現數據沒法插入了。以下錯誤:ui

jdbc.exception.UncategorizedSQLException: uncategorized SQLException for SQL [insert into AUDITS(C_ID,N_PERSON_ID,C_NAME,C_CODE,C_DEPT,N_LOG_TIME,C_LOG_TYPE,C_CONTENT,C_RESULT,C_SN,N_DEPT_ID) values(?,?,?,?,?,?,?,?,?,?,?)]; SQL state [72000]; error code [1502]; ORA-01502: index 'AUDITS_PK' or partition of such index is in unusable state
; caused by: ORA-01502: index 'AUDITS_PK' or partition of such index is in unusable state

採起以下方法重建索引解決處理。spa

select index_name,index_type,tablespace_name,table_type,status from user_indexes where index_name='AUDITS_PK';

alter session set skip_unusable_indexes=false;

alter index AUDITS_PK rebuild;
commit;

3.其出現這個問題的根本緣由和解決方法是什麼呢?

移動或者刪除表空間或者分區後,基於該table的索引會自動失效UNUSABLE;此時訪問或操做該table時,會報ORA-01502異常;不管惟一仍是普通索引都要經過重建解決。.net

解決方法:在使用表分區時儘可能建立本地索引.( 例如: create index AUDITS_PK on AUDITS(id) local;--由於id是分區鍵,因此這樣就建立了一個有前綴的本地索引) 這樣在刪除分區後則索引不會出現失效問題。日誌

相關文章
相關標籤/搜索