繁体   English   中英

SQL Server 2005定期清理表而不会导致用户错误

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM