若是咱們直接用delete from語句來刪除讀寫頻繁的大表中的數據,頗有可能會由於where的條件是全表掃描從而致使整個表被鎖住了。若是該表是讀寫頻繁的生產庫那簡直就是一場災難,全部的線上讀寫請求都會由於表被鎖而超時。spa
若是不想如此糟糕的狀況發生,咱們能夠先分析一下致使表被鎖住的緣由。既然全表掃描會會致使鎖表,那咱們就先把刪除操做分爲查詢和刪除。而後再分批刪除,如此就能夠保證不會引起線上讀寫請求大規模超時。若是這樣你還擔憂頻繁的分批刪除影響線上效率的話,還能夠在每一個批次加上必定的延時。code
/* step1:select all the id need to be delete to a temp table */ create table #Temp (ID int); insert #Temp select ID from TableTarget WHERE Time < '2019-01-01 00:00:00'; /* step2:detele the data by batch(1000) and every batch delay 10ms */ while 1=1 begin delete top (1000) from TableTarget where ID in (select ID from #Temp) WaitFor DELAY '00:00:00.10' if @@rowcount = 0 break end /* step3:remove the #temp table */ If(OBJECT_ID('tempdb..#temp') Is Not Null) Begin Drop Table #Temp End