我有一个表Tab_Log
,每天填满数千行。每周我都需要根据创建日期清理90%的行。使用delete
语句有效,但由于记录了所有删除操作,因此资源非常密集。我的第二个想法是将我不想从Tab_Log
中删除的数据插入临时表truncate Tab_Log
,然后将临时表中的记录插入。我担心的是在此过程中用户可能会在截断和重新插入过程中查询Tab_Log
并接收和发送错误。
那么如何快速擦除此表而不会给用户造成错误?有没有办法安全地锁定表,以便任何传入的查询请求将等待而不是错误输出?
答案 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秒钟给其他用户一个机会。
重复直到删除任何内容
根据需要调整此算法。