zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    python __init__.py
    估算小结
    ssh vim中不小心按下ctrl+s
    估算方法
    SSH 下使vim语法高亮显示 && 终端下vim配置
    not enough arguments for format string搞死人
    函数的形参 实参
    Linux 共享内存机制
    select函数参数及其使用
    找出两个字符串最长公共子串
  • 原文地址:https://www.cnblogs.com/keitsi/p/10256445.html
Copyright © 2011-2022 走看看