天天看點

ORACLE DELETE資料慢的案例

   今天遇到一個有意思的案例,一開發同僚告訴我他删除一個表的記錄非常慢,已經快1個多小時了還沒有完成。而且删除的記錄隻有1百多條。真是大跌眼鏡的一件

事情。最後發現該表與多個表有外鍵關聯關系(這個表即是主表、又是從表),最後我禁用引用該表的外鍵限制後。一秒内删除了記錄。然後啟用外鍵限制關系。下

面記錄、分析一下解決過程的思路(下面是在測試環境的記錄,資料量不一樣)。

去處理這個問題時,首先懷疑可能是sql的阻塞、觸發器、外鍵限制、高水位線等因素中的某一個導緻delete操作慢,于是我打算一個一個排除,我先試着

删除一條記錄,然後去檢查sql的阻塞情況,結果使用下面sql語句并沒有發現sql被阻塞。于是sql的阻塞導緻delete慢的原因被我排除了。

接下來,我檢查了該表的的觸發器,結果并沒有發現delete觸發器。也就是說delete操作并不會觸發任何觸發器。觸發器導緻delete慢的懷疑也可以排除掉了。

我用show_space檢查了一下這個表的高水位線,發現并沒有問題,不需要收縮高水位線。高水位線這個因素也可以排除了。隻剩下外鍵限制的影響了。于是檢查了一下有哪些表是該表的從表,如下所示

ORACLE DELETE資料慢的案例

有時候也可以用下面語句檢視引用這個表的外鍵引用關系

如上所示,inv_location_pallets這個表有三個從表,而這裡面有個表的記錄很大,大概2千多萬。是以導緻delete操作很慢。

ORACLE DELETE資料慢的案例