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

标签 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

最佳答案

生成列表时极其谨慎可能有些过分,但您会想要运行批量删除。

对于 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/

相关文章:

mysql - 显示类别及其计数

sql-server - 计算列中两天之间的方差

mysql - Hibernate 使用外键连接两个表

sql-server-2005 - 使用 Row_Number() - 查找最大注册

sql - SQL SERVER 2005 中基于函数的索引

mysql - 同表关系sql查询

PHP 如何编辑我刚刚创建的数据库条目? (基本的)

.net - 如何将巨大的 XML 文件转换为关系数据来执行查询

sql - 为什么SA账号不能再访问master数据库了?

远程连接到 SQL Server 2005 实例时出现 C# 异常