这@Aleksandr费德林的回答修改后的版本添加一个WHERE子句:
UPDATE x
SET x.CODE_DEST = x.New_CODE_DEST
FROM (
SELECT CODE_DEST, ROW_NUMBER() OVER (ORDER BY [RS_NOM]) AS New_CODE_DEST
FROM DESTINATAIRE_TEMP
) x
WHERE x.CODE_DEST <> x.New_CODE_DEST AND x.CODE_DEST IS NOT NULL
通过添加一个WHERE子句,我发现性能后续更新极大的改进。即使该值已经存在,Sql Server似乎也会更新该行,并且需要时间才能这样做,因此添加where子句可以跳过值未改变的行。我不得不说,我惊讶于它可以运行我的查询有多快。
声明:我不是数据库专家,我使用PARTITION BY作为我的子句,因此它可能不完全相同的结果为此查询。对于我来说,所讨论的列是客户的付款订单,所以一旦设置它,价值一般不会改变。
还要确保你有索引,特别是如果你在SELECT语句上有WHERE子句。过滤索引对我来说非常适合,因为我是基于付款状态进行过滤的。
我通过
UPDATE UpdateTarget
SET PaidOrderIndex = New_PaidOrderIndex
FROM
(
SELECT PaidOrderIndex, SimpleMembershipUserName, ROW_NUMBER() OVER(PARTITION BY SimpleMembershipUserName ORDER BY OrderId) AS New_PaidOrderIndex
FROM [Order]
WHERE PaymentStatusTypeId in (2,3,6) and SimpleMembershipUserName is not null
) AS UpdateTarget
WHERE UpdateTarget.PaidOrderIndex <> UpdateTarget.New_PaidOrderIndex AND UpdateTarget.PaidOrderIndex IS NOT NULL
-- test to 'break' some of the rows, and then run the UPDATE again
update [order] set PaidOrderIndex = 2 where PaidOrderIndex=3
使用分区查询中的 'IS NOT NULL' 没有如果列不可为空所需的部分。
当我说性能增加量很大时,我的意思是在更新少量行时基本上是瞬时的。有了正确的指标,我能够做到这一点花的时间相同的“内部”查询的更新确实本身:
SELECT PaidOrderIndex, SimpleMembershipUserName, ROW_NUMBER() OVER(PARTITION BY SimpleMembershipUserName ORDER BY OrderId) AS New_PaidOrderIndex
FROM [Order]
WHERE PaymentStatusTypeId in (2,3,6) and SimpleMembershipUserName is not null
后的样本数据和预期的结果,那就是得到一个SQL的最佳方式回答。否则你的?没有任何意义,并会产生这样的答案'UPDATE myCol = myCol + 1 FROM MyTable WHERE ID = @ MyID' – JonH