在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
当你需要它。
否则,它只是一个简单的UPDATE
有JOIN
:
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
答
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
很好的答案 – Lamak
我希望我可以去和丢弃列,但我来到这个项目它创造了许多年之后。这需要对前端网站以及我们的EDMX进行一些修改,以便在此时删除不必要的列。 虽然很好的答案!我很欣赏快速反应! – akaWizzmaster