在SQL Server 2012中更新数百万条记录

问题描述:

我认为这将通过包含几个表更容易解释。在SQL Server 2012中更新数百万条记录

表A:

UserId  StoreId 
1   10 
2   20 
3   30 
4   40 

表B:

UserId  StoreId 
1   10 
1   20 
1   20 
2   20 
2   10 
2   10 
3   30 
3   40 
3   40 
4   40 
4   30 
4   30 

我需要一个脚本,将进入表2和更新存储匹配表A中StoreId针对特定用户。最后,我应该看看;

表B:

UserId  StoreId 
1   10 
1   10 
1   10 
2   20 
2   20 
2   20 
3   30 
3   30 
3   30 
4   40 
4   40 
4   40 

所以我的问题是,什么是做最简单的方法,考虑到表B的数百万行的百强它,和桌子的有大约20万行?

提前致谢!

最好的办法是:

ALTER TABLE Table_B 
DROP COLUMN StoreId 

现在你不再存储重复数据,你可以直接从Table_A得到StoreId当你需要它。

否则,它只是一个简单的UPDATEJOIN

UPDATE B 
SET 
    StoreId = A.StoreID 
FROM 
    Table_B B 
INNER JOIN TABLE_A A ON A.UserId = B.UserId 

你可以把这个到,如果你为了削减更新的大小,以便它不需要执行批次循环将您的交易日志泛滥成灾。有几种方法可以做到这一点。举个例子:

DECLARE 
    @batch_size INT = 10000, 
    @min_user_id INT = 1, 
    @max_user_id INT 

SELECT @max_user_id = MAX(UserId) FROM Table_A 

WHILE (@min_user_id <= @max_user_id) 
BEGIN 
    UPDATE B 
    SET 
     StoreId = A.StoreID 
    FROM 
     Table_B B 
    INNER JOIN TABLE_A A ON A.UserId = B.UserId 
    WHERE 
     B.UserId BETWEEN @min_user_id AND @min_user_id + @batch_size 

    SET @min_user_id = @min_user_id + @batch_size + 1 
END 
+1

很好的答案 – Lamak

+0

我希望我可以去和丢弃列,但我来到这个项目它创造了许多年之后。这需要对前端网站以及我们的EDMX进行一些修改,以便在此时删除不必要的列。 虽然很好的答案!我很欣赏快速反应! – akaWizzmaster

select 1 
while (@@rowcount > 0) 
begin 
    UPDATE top(1000) B 
    SET b.StoreId = A.StoreID 
    FROM Table_B B 
    INNER JOIN TABLE_A A ON A.UserId = B.UserId 
    where b.StoreId <> A.StoreID 
     or b.StoreId is null 
end