2017-06-15 54 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'形式的更新不是不寫數據的無操作。 –

相關問題