我正在尝试从我们的数据库中清除大量超过13个月的数据的历史数据。
我已经编写了一个用于截断的存储过程,但是当我尝试运行它们时,我遇到了两个问题。
问题1 - 当磁盘驱动器空间不足时,删除将填满数据库事务日志并使数据库崩溃。
问题2 - 脚本本身需要很长时间才能执行。
以下是SP中的陈述:
DELETE FROM Header_Table WHERE Date_DT < @date
Header_Table
表与其他10个表有ON DELETE CASCADE
关系。这意味着当我触发上述查询时,它会删除Header_Table
表中的数据以及Header_Table
在第二个语句中,我将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
在下面的语句中,我实际上是从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
答案 0 :(得分:3)
在这种情况下,你应该总是删除数据块。我建议批量删除数据。
答案 1 :(得分:0)
备份事务日志的频率是多少?如果您在其自己的事务中批量删除每个批处理,则频繁的事务日志备份应该阻止事务日志填满,除非您的系统没有设置为备份它们(或者只是在不合适的长计划中这样做)。注意事务日志备份与数据库备份完全不同,应该在事务系统中经常发生 - 我们每15分钟备份一次。另外因为你有级联删除(我个人绝不允许),你可能需要一个相当小的批次。