通過降低表的高水位(HWM: High Water Mark) ,解決一生產系統故障

dcswinner發表於2012-02-10

昨天系統運維的同事接到電話,說全國各地多出反映代收貨款業務沒做,資料未生成。系統其它方面都正常。然後請我分析看看關於這一塊的資料庫是否正常。客戶一直在電話催著解決,專案經理也在頂著壓力催著。

通過分析資料庫,發現資料庫上一直有兩個和代收貨款有關的sql在執行,insert語句,一個是delete語句。將這個兩個語句capture出來分析,檢視其執行計劃,都很正常(抓出來的sql是含有繫結變數的)。想到可能由於繫結變數的原因,生成的執行計劃不準確,特意代進去幾個具體的值執行,發現執行時間都需要10秒左右,而這個sql的實時性要求非常高,需要在幾毫秒內處理完,否則就會有資料積壓,就會積壓越來越多,越來越慢,這兩個sql在系統中呼叫非常頻繁,一直在迴圈執行,而這個sql都是按照主鍵來操作的,理應在幾毫秒就可以完成。檢視涉及到的表的資料量,只有幾十行,即使select * from table_name也是很慢。因此這個應該是表的hwm很高導致的,因為這些表的delete,insert非常頻繁。

因此需要立刻降低表的hwm。在oracle 10g中,影響最小的降低hwm的辦法是收縮表:

alter table table_name shrink space;

(採用move操作需要重建索引,對生產系統影響有點大)。

操作完後,再執行上面的兩個sql,確實做到了幾毫秒執行完畢。

再檢視代收貨款相關表的資料,發現有些資料已經在處理了。過半個小時後,所有滯後的資料均已經處理完畢,客戶關心的問題得到解決!

另外,如果表上有fbi(基於函式的索引),是不能對錶進行shrink的。

相關連結:

http://blog.csdn.net/tianlesoftware/article/details/4707900

 

 

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

相關文章