1

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

那么我怎样才能快速清理这个表而不会给用户造成错误呢?有没有办法安全地锁定表,以便任何传入的查询请求都会等待而不是出错?

4

2 回答 2

1

明显的解决方法。

1 - 使用 SqlAgent 安排周日凌晨 3 点的 90% 删除

2 -- 通过删除更小块的记录来执行删除而不杀死数据库。

例如,使用要选择的记录的所有主键的主键填充临时表。(这样做可以防止重复扫描主表,如果您在日期字段上被索引,只需删除前 100 个)

休眠 2 秒,给其他用户一个机会。

重复直到没有东西可以删除

根据需要调整此算法。

于 2013-10-31T15:21:59.183 回答
1

我建议您批量删除:

WHILE 1 = 1 
  BEGIN; 
    DELETE TOP(500) FROM Tab_Log WITH(ROWLOCK) WHERE CreateDate = zyz; 
    IF @@RowCount = 0 BREAK; 
  END;
于 2013-10-31T15:15:26.817 回答