2015-09-09 51 views
0

我有一个数据库,每天用增量数据填充数据,然后在每个月的月底将该月的数据全部下载到系统中。我们的业务希望每一天都投入到系统中,然后在每个月的月底将日常资料移除并留下完整的月份数据。我已经写下了下面的查询,如果你能帮助,我会很感激。使用while循环清除数据。

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 @[email protected]+1 
    END; 

    DROP TABLE #work_to_do_for; 

我需要执行几个表上的清除。

在此先感谢。

+0

大约每月有多少条记录被清除? – rwking

+0

它可能是每个快照数百万。 – mhodges

+0

好的。而你正在试图用你发布的查询完成什么? – rwking

回答

0

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

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结束,但此方法将帮助您找到每批删除的最佳数量。然后,将其作为循环运行。这就是说,如果你真的删除百万个记录,只要你不打算干扰其他进程,删除和重新创建表可能更有意义。如果您需要保存某些的数据,您可以将所需的内容插入新表(例如MyTable_New),放弃原始表(MyTable),并将MyTable_New重命名为MyTable。

+0

我需要进入包含日常文件的表格,然后使用该快照名称将其删除。我最大的桌子可以在最终的每日下载中删除1000万条记录。我无法截断或删除表格,因为我在表格中拥有7年以前的记录。 – mhodges

+0

你有多少记录保存在表格中?听起来你需要做第二个选择。 1.创建一个具有相同结构的新表。 2.插入要保留的记录。 3.删除旧表并将新表重命名为旧名称。同样,如果您保留了100 M记录(例如),您不会希望将这些记录插入到新表中,您只需要批量删除想要删除的内容。我建议你认真考虑历史数据的归档表。 – rwking

0

如果可能的话,您已经发布的使用while循环迭代并删除行的脚本应该更改为基于集合的操作。关系数据库引擎擅长基于数据集的操作,比如

Delete dbo.table WHERE yourcolumn = 5

,而不是在同一时间通过一个迭代。特别是如果它将用于上面评论中指出的“数百万”行。

+0

尽管有数百万条记录?这可能会破坏事务日志。 http://sqlperformance.com/2013/03/io-subsystem/chunk-deletes – rwking