使用 while 循环清除数据。

Purge data using a while loop.

我有一个数据库,每天都会填充增量数据,然后在每个月底将当月数据的完整下载放入系统中。我们的业务希望将每一天都放入系统中,然后在月底删除每天的内容并保留完整的月份数据。我已经在下面编写了查询,如果您能提供帮助,我将不胜感激。

DECLARE @looper INT
DECLARE @totalindex int;

select  name, (substring(name,17,8)) as Attempt, substring(name,17,4) as [year], substring(name,21,2) as [month], create_date
into #work_to_do_for
from sys.databases d
where name like 'Snapshot%' and 
d.database_id >4 and
(substring(name,21,2) = DATEPART(m, DATEADD(m, -1, getdate()))) AND (substring(name,17,4) = DATEPART(yyyy, DATEADD(m, -1, getdate()))) 

order by d.create_date  asc


SELECT @totalindex = COUNT(*) from #work_to_do_for

SET @looper = 1 -- reset and reuse counter
WHILE (@looper < @totalindex)
    BEGIN;

set @looper=@looper+1
    END;

    DROP TABLE #work_to_do_for;

我需要对多个表执行清除。

提前致谢。

您发布的使用 while 循环迭代删除行的脚本应尽可能更改为基于集合的操作。关系数据库引擎 excel 基于集合的操作,如

Delete dbo.table WHERE yourcolumn = 5

而不是一次迭代一个。特别是如果它将用于 "several million" 行,如您在上面的评论中指出的那样。

当我删除大量记录时,我总是分批和非工作时间进行,以免在生产过程中耗尽资源。为此,您结合了一个循环和一些测试以找到一次删除的最佳数量。

begin transaction del -- I always use transactions as a safeguard
declare @count int = 1

while @count > 0
    begin
    delete top (100000) t
    from dbo.MyTable t -- JOIN if necessary
    -- WHERE if necessary

    set @count = @@ROWCOUNT
end

运行 手动(没有 WHILE 循环)1 次,括号中有 100000 条记录,看看你的执行时间是多少。写下来。 运行 又是 200000 条记录。查看时间;写下来。 运行 它有 500000 条记录。您正在寻找的是执行时间的趋势。只要删除 100000 条记录所需的时间随着批量大小的增加而减少,就继续增加它。您可能以 500k 结束,但此方法将帮助您找到每批删除的最佳数量。然后,运行它作为一个循环。

也就是说,如果您确实要删除 百万 条记录,那么删除并重新创建 table 可能更有意义,只要您不这样做会干扰其他进程。如果您需要保存 一些 数据,您可以将您需要的数据插入到一个新的 table 中(例如 MyTable_New),删除原来的 table (MyTable),并将 MyTable_New 重命名为 MyTable。

@rwking 你要把 COMMIT 放到事务的什么地方。我的意思是你是在单个事务中保留所有符合条件的删除计数并进行最后一次提交吗?

我有类似的要求,我必须批量删除,并跟踪最后影响的计数数量。 我的示例代码如下:

声明@count int
声明@deletecount int

设置@count=0

同时(1=1)
开始

开始尝试

开始翻译
从 --CONDITION

中删除前 1000 个

SET @COUNT = @COUNT+@@ROWCOUNT

IF (@@ROWCOUNT)=0
休息;

提交

结束捕捉

开始接球

回滚;
结束捕捉

结束

设置@deletecount=@COUNT

以上代码工作正常,但是如果回滚发生在其中一个批次中,如何跟踪@deletecount。