有没有更好的方式来进行简单的更新拆分工作?

问题描述 投票:2回答:1

我在做一个表是非常简单的一排的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';

这真的就是这么简单。但我的问题是,这是在生产运行记录数量庞大的表,但确切的数字是运行更新之前未知。有一个时间戳列。而且它可能更重要的是先更新最新的。

但我的问题可能是一个更prectical之一。

它是最好的时间戳来划分这件事,让它手动运行,还是有让这个运行的更好的方法?我还可以划分每个更新语句的工作。

或者是有一些办法可以把这样的事情到脚本本身?

我试图寻找的查询计划,但它并没有告诉我拆它的最佳途径。

sql sql-server optimization query-optimization sql-server-2014
1个回答
3
投票

Use Update Top

您可以更新数据,使用while循环和更新顶部的选项块:

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

    if @@ROWCOUNT < 1000 BREAK
END

@@ROWCOUNT小于1000这是块的大小这意味着所有行被更新。

需要注意的是,根据官方文档:

在TOP表达式中引用的行用于与插入,更新,或删除不设置在任何顺序。

Update using TOP and 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

Other helpful links

© www.soinside.com 2019 - 2024. All rights reserved.