gpt4 book ai didi

sql - 有没有更好的方法来拆分工作以进行简单更新?

转载 作者:行者123 更新时间:2023-12-03 17:20:36 25 4
gpt4 key购买 nike

我正在对一个表中的一行进行MS SQL Server更新,这非常简单。我将另外4件事替换为4件事。

update Table set Column1 = 'something new' where Column1 = 'something old';
update Table set Column1 = 'something new 2' where Column1 = 'something old 2';
update Table set Column1 = 'something new 3' where Column1 = 'something old 3';
update Table set Column1 = 'something new 4' where Column1 = 'something old 4';


真的就是全部。但是我的问题是,这是一个在生产环境中运行着大量记录的表,但是在运行更新之前,确切的数目是未知的。
有一个时间戳列。首先更新最近的更新可能更重要。

但是我的问题可能是一个更确切的问题。

最好按时间戳对其进行分区,然后使其手动运行,还是有更好的方法让它运行?我还可以按每个更新语句划分工作。

还是有某种方法可以将此类内容放入脚本本身?

我曾尝试查看查询计划,但并没有告诉我将其拆分的最佳方法。

最佳答案

使用更新顶部

您可以使用while循环和Update Top选项将数据更新为块:

WHILE 1 = 1
BEGIN
UPDATE top (1000) tableToUpdate
SET Column1 = 'something new'
WHERE
Column1 = 'something old';

if @@ROWCOUNT < 1000 BREAK
END


@@ROWCOUNT小于块大小的 1000时,表示所有行都已更新。

请注意,基于官方文档:


与INSERT,UPDATE或DELETE一起使用的TOP表达式中引用的行未按任何顺序排列。


使用TOP和Order BY更新

如果您要根据时间戳更新排序的数据,则在官方文档中他们提到:


如果必须使用TOP在有意义的时间顺序中应用更新,则必须在子选择语句中将TOP与ORDER BY一起使用。


例如:

WHILE 1 = 1
BEGIN
UPDATE tableToUpdate
SET Column1 = 'something new'
FROM (SELECT TOP 1000 IDColumn FROM tableToUpdate WHERE tableToUpdate.Column1 = 'something old' ORDER BY TimeStamp DESC) tto
WHERE
tableToUpdate.ID = tto.ID;

if @@ROWCOUNT < 1000 BREAK
END


其他有用的链接


UPDATE (Transact-SQL) - official documentation
How can I create a loop on an UPDATE statement that works until there is no row left to update?
Fastest way to update 120 Million records
How to update large table with millions of rows in SQL Server?
Updating rows in a large table in sql server

关于sql - 有没有更好的方法来拆分工作以进行简单更新?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54638381/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com