為什麼分次批量刪除一個帶索引的大表裡的資料會慢
阿新 • • 發佈:2019-02-03
我使用的是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空間可能不夠放。所以建議大家刪資料時要一鼓作氣!!
另,不知道其他專家有沒有好的方法呢?