0

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

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

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

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

以下是 SP 中的语句:

DELETE FROM Header_Table WHERE Date_DT < @date

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

  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
    
4

2 回答 2

3

在这种情况下,您应该始终以块的形式删除数据。我的建议是,批量删除数据。

于 2013-05-22T12:11:06.727 回答
0

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

于 2013-05-22T14:51:25.717 回答