[英]SQL Server 2005 Periodically Cleanup Table Without Causing User Errors
我有一个表Tab_Log
,每天要填充成千上万的行。 每周我都需要根据创建日期来整理90%的行。 使用delete
语句是可行的,但是非常耗费资源,因为记录了所有删除操作。 我的第二个想法是将我不想从Tab_Log
删除的数据插入到临时表中, truncate Tab_Log
,然后再从临时表中插入记录。我担心的是,在此过程中,用户可能会在查询过程中查询Tab_Log
截断并重新插入过程以及接收和错误。
那么,如何快速清理此表而又不会给用户造成错误? 有没有一种方法可以安全地锁定表,以便所有传入的查询请求都将等待而不是出错?
我建议分批删除:
WHILE 1 = 1
BEGIN;
DELETE TOP(500) FROM Tab_Log WITH(ROWLOCK) WHERE CreateDate = zyz;
IF @@RowCount = 0 BREAK;
END;
明显的解决方法。
1-使用SqlAgent安排在星期日凌晨3点进行90%的删除
2-通过删除较小块中的记录来执行删除操作而不杀死数据库。
例如,用要选择的记录的所有主键的主键填充临时表。 (这样做可以避免必须重复扫描主表,如果您在日期字段上建立了索引,则只需删除前100位即可)
睡眠2秒钟,让其他用户有机会。
重复直到没有要删除的
根据需要调整此算法。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.