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
复制代码

 

posted @   keitsi  阅读(2659)  评论(0编辑  收藏  举报
编辑推荐:
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
阅读排行:
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
点击右上角即可分享
微信分享提示