1. 程式人生 > >為什麼分次批量刪除一個帶索引的大表裡的資料會慢

為什麼分次批量刪除一個帶索引的大表裡的資料會慢

我使用的是PL/SQL工具來進行刪除。 

在這裡,分次的意思是指關閉PL/SQL後再開啟。

一個表,資料量很大,有幾億條,某欄位uindex做了索引。

如果開啟PL/SQL後一直執行

delete from mytable t where uindex<1167580800 and rownum<150000

每次都只是幾十秒時間,但如果關閉PL/SQL後再開啟再執行相同的語句,就會很慢了,可能十幾分鍾都未有結果。經細看,發現原來是以下原因:由於之前已經刪了很多資料符合該條件的資料,所以表中按順序存放的資料前段部分(例如前3千萬裡)再存在符合條件的資料已經很少,而ORACLE對刪除操作的會話第一次開啟時是按順序來搜尋資料表的,所以我們在會話裡看到Logical Reads數量不斷增大,其實就是oracle在遍歷資料表,尋找符合條件的資料。當完成第一次刪除後,第二次執行該語句時,由於會話已經記錄了最後執行到哪個位置,直接由該位置開始繼續往下尋找資料,所以就快許多了,感覺上,只要有rownum的條件存在,ORACLE只要找到足夠數目的符合條件的資料,就不再往下找的了,所以刪除大表裡的資料,這個條件必不可少,不然的話,UNDO空間可能不夠放。所以建議大家刪資料時要一鼓作氣!!

另,不知道其他專家有沒有好的方法呢?