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

时间:2013-10-31 15:08:02

标签: sql sql-server database

我有一个表Tab_Log,每天填满数千行。每周我都需要根据创建日期清理90%的行。使用delete语句有效,但由于记录了所有删除操作,因此资源非常密集。我的第二个想法是将我不想从Tab_Log中删除的数据插入临时表truncate Tab_Log,然后将临时表中的记录插入。我担心的是在此过程中用户可能会在截断和重新插入过程中查询Tab_Log并接收和发送错误。

那么如何快速擦除此表而不会给用户造成错误?有没有办法安全地锁定表,以便任何传入的查询请求将等待而不是错误输出?

2 个答案:

答案 0 :(得分:1)

我建议您批量删除:

WHILE 1 = 1 
  BEGIN; 
    DELETE TOP(500) FROM Tab_Log WITH(ROWLOCK) WHERE CreateDate = zyz; 
    IF @@RowCount = 0 BREAK; 
  END;

答案 1 :(得分:1)

明显的解决方法。

1 - 使用SqlAgent计划在星期日3 AM删除90%

2 - 通过删除较小块中的记录来执行删除而不中断数据库。

例如,使用要选择的记录的所有主键的主键填充临时表。 (执行以防止必须重复扫描主表,如果您在日期字段上编入索引,只需删除前100名)

睡2秒钟给其他用户一个机会。

重复直到删除任何内容

根据需要调整此算法。