2017-06-15 68 views
1

对于SQL来说是新手,是否有人会知道执行以下更新的更快方法?寻找一种更快的方式来更新SQL表上的许多列

也许使用数组或对每个元素。

update ItemDynamic 
set price = SnapShotPrice 
where SnapShotPrice <> Price 

update ItemDynamic 
Set PriceLevelA = SnapShotPriceA 
where snapshotpriceA <> PricelevelA 

update ItemDynamic 
Set PriceLevelB = SnapshotpriceB 
where snapshotpriceB <> PricelevelB 

update ItemDynamic 
Set PriceLevelC = SnapshotpriceC 
where snapshotpriceC <> PricelevelC 
+0

它们被称为索引。 SSMS附带一个查询分析器,可以建议添加索引。你应该使用它。 – Will

+1

更新语句3和4看起来是相同的。它是否正确? –

回答

4

您可以在单个更新语句中执行此操作。像这样的东西。

update ItemDynamic 
SET price = CASE WHEN SnapShotPrice <> Price then SnapShotPrice ELSE price end 
    , PriceLevelA = CASE WHEN snapshotpriceA <> PricelevelA then SnapShotPriceA ELSE PriceLevelA end 
    , PriceLevelB = CASE WHEN snapshotpriceB <> PricelevelB THEN SnapshotpriceB ELSE PriceLevelB end 

不太确定你的第四条更新声明的要点是什么,因为它与第三条更新声明相同。

+0

如果所涉及的列都不可为空,则可以进一步简化为“SET Price = SnapshotPrice”等。值得指出的是,在这种形式下,语句将无条件地更新每一行(即使只是幂等地),而原始声明不。这可能会也可能不会更快,这取决于索引和数据分布。 –

+0

我认为添加谓词来限制正在更新的行,但这很可能会更慢,因为会有多个不等于谓词。鉴于这个令人难以置信的模糊问题,我只是试图指出,它可以在一个陈述中完成,而不是3(或4)。 –

+0

我明白了,但正如原来特意要求“更快”(对于我们所知的所有可能只是“更少的代码”),我感到有必要指出此解决方案的里程可能会有所不同。特别是,人们经常感到惊讶的是,“SET Column = Column'形式的更新不是不写数据的无操作。 –

相关问题