大分割槽表的手工並行優化
這段時間飽受大分割槽表的效能之苦,碰到最大的一個分割槽表有1個t左右,操作起來每個細節都需要格外小心,我這次和大家分享的案例應用的分割槽表不是很大,有80G左右。但是這個分割槽主要分割槽比較多,有將近2000個左右的分割槽。 舉一個案例來說明一下。 現在要做以下下幾件事,要保證要宕機時間儘可能短。 為了方便起見,我暫定現在有4個DB instance,叫par01,par02,par03,par04. 1.需要對par01的資料執行Update語句,根據條件更新(update操作可能會移動分割槽), 2.然後把par01的資料匯出來 3.重新對par01,par02,par03,par04進行分割槽 4.選擇性的把資料匯入到par01,par02,par03,par04 所以看以上步驟最終目的就是把par01的資料更新以後重新分佈到par01,par02,par03,par04上去。
exp xxxx file=par01_xxxxxx.dmp log=par01_xxxxx.log statistics=none grants=n constraints=n indexes=n tables=xxxx query="where code in (xxx,xxx,xxx)" buffer=9102000
expdp在這種情況下沒有明顯的優勢,首先query選項啟用,direct就沒作用了,開了並行,等了好一會,貌似Hang住了, 最後採用的方法是:採用匯出分割槽的方式,根據資料量和業務情況,把匯出工作分成5個單獨的程序來跑,每個程序會匯出指定的分割槽 比如 thread1:分割槽par_001~par_005 thread2:分割槽par_100~par_105 檢視系統的負載,匯出時cpu都是滿載的,效果應該和expdp的並行效果差不多,但是控制要靈活。 最後統計結果,本來需要100分鐘以上的任務,最後用了將近30分鐘就全部導完了。
3.重新對par01,par02,par03,par04進行分割槽 需要對Par01,02,03,04的分割槽進行重新的組織。比如原來表只有100個可能根據需要得分成200個分割槽了,而且分割槽名稱也有要求。 這個地方可能有兩種實現, 一種是把分割槽都drop掉,只留一個max pattition,然後split partition 另一種方法是把分割槽不斷的進行merge,最後合併成一個max parition. 我最終選用的是第一種方法,因為比較直觀簡單,重新分割槽的時候步驟很有規律,我生成了動態sql來刪除分割槽,只保留預設的max partition. 這個部分多說一句,有的朋友可能建議不刪資料了,直接根據需要split partition,生成指定的分割槽,我嘗試了這種方法,速度太慢。可能有大量的資料會從各個partition間不斷的move> 4.選擇性的把資料匯入到par01,par02,par03,par04 這個部分基於步驟2,獨立的匯入,時間也好控制。 比如說par02這個分割槽比較大,我匯出的時候就生成了兩個dump檔案,然後匯入的時候,就可以在par02上分兩個獨立的匯入程序操作。 以上是自己的一些總結。也對比了一些其他優化的案例。有些不足,還希望大家多多指教。