拆分删除查询

时间:2018-09-12 09:32:55

标签: tsql sql-server-2012

有一个表a与其他表有很多关系。 在其中一些关系中,已设置casade delete rule

我正在尝试从所有数据中清除表a,但是在使用delete from a时遇到了几个问题

  • 删除过程非常慢
  • 事务日志已填满(磁盘空间在这里是一个问题。)使查询挂起。

我有温度。将数据库置于简单恢复模式,但tran.log的问题仍然存在。

我一直在考虑拆分删除查询,但是还没有找到更快的方法。尝试top()尝试使用where clause拆分ID。

有人有任何提示可以更快地清空此表吗?

1 个答案:

答案 0 :(得分:1)

我已经构建了以下脚本,用于将删除操作拆分为多个块,并基于主键“ id”在“消息”选项卡中报告状态。

DECLARE @countid int;
DECLARE @remaining int;
DECLARE @aantal int;
DECLARE @msg varchar(200);
SET @aantal = 100 -- Ammount that has to be deleted
SET @remaining = (select count(*) from Table);
SET @countid = (select MIN(id) + 100 from Table);

WHILE @remaining > 0
    BEGIN

        SET @msg = ('Remaining rows: ' + cast(@remaining as Varchar));
        raiserror (@msg,0,1) with nowait

        DELETE FROM Table
            WHERE id < @countid

        SET @remaining = @remaining - @@ROWCOUNT    
        SET @countid = @countid + @aantal

  CHECKPOINT -- Since the Recovery Model is Simple this clears the transaction log
END