我正在为之工作的公司有一些巨大的日志/日志表,每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
答案 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()
。拥有分区允许您在旧分区上执行维护(删除,复制等),而不会影响当前分区。