在SQL Server中更新大型表中的行的最快方法

时间:2018-09-17 10:15:01

标签: sql-server-2008 sql-server-2012

我在sql server中有一个疑问 基本上,我需要在具有6000万行的表上运行它,一次更新每一行都会崩溃,因此我想对查询进行批处理,以便如果崩溃,它可以重新运行查询,并且跳过完成的批处理,继续处理剩下的那些。

我想用empref表的引用来更新emp表数据。这里的两个表都有记录数,但是我在下面提供了一些示例数据。

在更新时,我们需要使用top子句拆分批次,并且不应重复现有的top。

带有数据的样本表:

CREATE TABLE [dbo].[emp](
    [id] [int] NULL,
    [name] [varchar](50) NULL,
    [sal] [int] NULL
) 
CREATE TABLE [dbo].[empref](
    [id] [int] NULL,
    [name] [varchar](50) NULL,
    [sal] [int] NULL
) 
INSERT [dbo].[emp] ([id], [name], [sal]) VALUES (1, N'a', 100)
GO
INSERT [dbo].[emp] ([id], [name], [sal]) VALUES (2, N'b', 200)
GO
INSERT [dbo].[emp] ([id], [name], [sal]) VALUES (4, N'u', 300)
GO
INSERT [dbo].[emp] ([id], [name], [sal]) VALUES (7, N'x', 400)
GO
INSERT [dbo].[emp] ([id], [name], [sal]) VALUES (8, N't', 500)
GO
INSERT [dbo].[empref] ([id], [name], [sal]) VALUES (1, N'xx', 100)
GO
INSERT [dbo].[empref] ([id], [name], [sal]) VALUES (2, N'bb', 200)
GO
INSERT [dbo].[empref] ([id], [name], [sal]) VALUES (4, N'uu', 300)
GO
INSERT [dbo].[empref] ([id], [name], [sal]) VALUES (7, N'xxx', 400)
GO
INSERT [dbo].[empref] ([id], [name], [sal]) VALUES (8, N'tt', 500)
GO
INSERT [dbo].[empref] ([id], [name], [sal]) VALUES (10, N'ub', 600)
GO

基于上述数据,我希望输出如下:

emp:
id  |name|sal
1   |xx |100
2   |bb |200
4   |uu |300
7   |xxx|400
8   |tt |500

我尝试如下:

declare @i int
 set @i=1

 while ( @i <= (select max(id) from emp ))

 begin 
 update  TOP(2)  t  set t.name=s.name 
 from emp t join empref s  on t.id=s.id 
 print @@rowcount

 set @i=@i+1
 end 

上面的更新查询仅更新仅前2个记录,并且不迭代下一个前2个记录update查询。 它总是只更新前2条记录。

请告诉我如何使用sql server中的while循环创建多个批处理。

1 个答案:

答案 0 :(得分:0)

不能说这将是最快的方法,但是WHILE LOOP选择相同的两行的原因是,您还需要跟踪{{1}上的Id列}表

假设Emp列是Id列且没有空格

Identity