从巨大的生产表中复制数据

时间:2012-02-13 20:54:52

标签: sql sql-server sql-server-2005 tsql

我正在为之工作的公司有一些巨大的日志/日志表,每10秒左右就会写一次交易。我想要删除此表中的大量数据并将其从该表中删除,因为大约75%的旧数据可以放在存档表或其他内容中,但是如果我这样做错了并且表被锁定了这将是一场灾难。

在之前的一个问题中,一个人想出了类似的东西,我想知道这不会搞砸一切,nolock暗示是否足以保证我的安全并且所有的写入工作都很好?如果没有,我该怎么办?

set identity_insert newtable on
DECLARE @StartID bigint, @LastID bigint, @EndID bigint
select @StartID = max(id)+1
from newtable

select @LastID = max(ID)
from oldtable

while @StartID < @LastID
begin
set @EndID = @StartID + 1000000

insert into newtable (FIELDS,GO,HERE)
select FIELDS,GO,HERE from oldtable (NOLOCK)
where id BETWEEN @StartID AND @EndId

set @StartID = @EndID + 1
end
set identity_insert newtable off
go

2 个答案:

答案 0 :(得分:3)

生成列表时要极其谨慎,但是您可能希望运行批量删除。

对于INSERT,您可能不需要WHILE循环。但是对于DELETE,我会使用类似的东西(根据您的需要调整批量大小):

WHILE 1=1
BEGIN
   DELETE TOP (10000) o
   FROM OldTable o
   INNER JOIN NewTable N
      ON o.id = n.id
   IF @@ROWCOUNT < 10000 BREAK;
END

只要有要删除的记录,这一次就会DELETE个10k记录。

答案 1 :(得分:0)

一种选择是按小时对表进行分区(假设表中有DATETIME列,每个插入时默认为GETDATE()。拥有分区允许您在旧分区上执行维护(删除,复制等),而不会影响当前分区。