mas*_*der 5 sql t-sql sql-server sql-server-2005
我正在为之工作的公司有一些巨大的日志/日志表,每10秒左右就会写一次交易.我想要删除此表中的大量数据并将其从该表中删除,因为大约75%的旧数据可以放在存档表或其他内容中,但是如果我这样做错了并且表被锁定了这将是一场灾难.
在之前的一个问题中,一个人想出了类似的东西,我想知道这不会搞砸一切,是否有足够的提示保证我的安全并且所有的写入工作都很好?如果没有,我该怎么办?
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
Run Code Online (Sandbox Code Playgroud)
生成列表时极其谨慎可能有些过分,但您将需要运行批量删除。
对于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
Run Code Online (Sandbox Code Playgroud)
DELETE
只要有记录要删除,就会一次删除 10k 条记录。