从SQL Server数据库中删除大量数据

时间:2013-05-22 12:08:04

标签: sql-server-2008 sql-delete

我正在尝试从我们的数据库中清除大量超过13个月的数据的历史数据。

我已经编写了一个用于截断的存储过程,但是当我尝试运行它们时,我遇到了两个问题。

问题1 - 当磁盘驱动器空间不足时,删除将填满数据库事务日志并使数据库崩溃。

问题2 - 脚本本身需要很长时间才能执行。

以下是SP中的陈述:

DELETE FROM Header_Table WHERE Date_DT < @date

Header_Table表与其他10个表有ON DELETE CASCADE关系。这意味着当我触发上述查询时,它会删除Header_Table表中的数据以及Header_Table

中的10个表引用中的数据
  1. 在第二个语句中,我将Information_Table表中的数据插入临时表。

    INSERT INTO Temp_Table (Key, AccNum, Exp, Name_VC) 
       SELECT  
          in.Key AS CRD_NFO_CIK, 
          in.Acct_Num AS CRD_NFO_ACC, 
          in.Exp AS CRD_NFO_EXP,
          in.Name_on_Card_VC AS CRD_NFO_NAME    
       FROM 
          Information_Table in
       LEFT OUTER JOIN 
          Card_T crd ON in.Key = crd.Card_Info_Key
       LEFT OUTER JOIN 
          Business_T business ON in.Key = business.CC_Info_Key 
       LEFT OUTER JOIN 
          Con_T contr ON in.Key = contr.Card_Info_Key 
       LEFT OUTER JOIN 
          Customer_Payment_T customer ON in.Key = customer.Card_Info_Key 
       LEFT OUTER JOIN 
          Temp_Table Temp ON in.Key = Temp.Key
       WHERE 
          Temp.Key IS NULL AND
          crd.Card_Info_Key IS NULL AND 
          business.CC_Info_Key IS NULL AND 
          contr.Card_Info_Key IS NULL AND
          customer.Card_Info_Key IS NULL
    
  2. 在下面的语句中,我实际上是从Information_Table中删除数据

     DELETE info  
     FROM Information_Table in    
     LEFT OUTER JOIN Card_T crd ON in.Key = crd.Card_Info_Key    
     LEFT OUTER JOIN Business_T business ON in.Key = business.CC_Info_Key     
     LEFT OUTER JOIN Con_T contr ON in.Key = contr.Card_Info_Key     
     LEFT OUTER JOIN Customer_Payment_T customer ON in.Key = customer.Card_Info_Key  
     WHERE 
        crd.Card_Info_Key IS NULL AND 
        business.CC_Info_Key IS NULL AND 
        contr.Card_Info_Key IS NULL AND
        customer.Card_Info_Key IS NULL
    

2 个答案:

答案 0 :(得分:3)

在这种情况下,你应该总是删除数据块。我建议批量删除数据。

答案 1 :(得分:0)

备份事务日志的频率是多少?如果您在其自己的事务中批量删除每个批处理,则频繁的事务日志备份应该阻止事务日志填满,除非您的系统没有设置为备份它们(或者只是在不合适的长计划中这样做)。注意事务日志备份与数据库备份完全不同,应该在事务系统中经常发生 - 我们每15分钟备份一次。另外因为你有级联删除(我个人绝不允许),你可能需要一个相当小的批次。