SQL Server從讀寫頻繁的大表中刪除大批量數據


如果我們直接用delete from語句來刪除讀寫頻繁的大表中的數據,很有可能會因為where的條件是全表掃描從而導致整個表被鎖住了。如果該表是讀寫頻繁的生產庫那簡直就是一場災難,所有的線上讀寫請求都會因為表被鎖而超時。

如果不想如此糟糕的情況發生,我們可以先分析一下導致表被鎖住的原因。既然全表掃描會會導致鎖表,那我們就先把刪除操作分為查詢和刪除。然后再分批刪除,如此就可以保證不會引發線上讀寫請求大規模超時。如果這樣你還擔心頻繁的分批刪除影響線上效率的話,還可以在每個批次加上一定的延時。

/* 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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM