我工作的公司有一些巨大的日志/日记表,每 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
最佳答案
生成列表时极其谨慎可能有些过分,但您会想要运行批量删除。
对于 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
只要有记录要删除,这就会一次删除
10k 条记录。
关于sql - 从巨大的生产表中复制数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9267874/