2009-08-19 52 views
2

我有一個包含很多列(可能是100+)的表(實際上有幾個)。更新表格中的行時,如果只更改了幾列,那麼性能最佳。更新表中有很多列的行

  1. 要動態構建UPDATE語句只更新已更改的列。
  2. 建立一個包含所有列的參數化UPDATE語句,包括那些沒有改變的列。
  3. 創建一個將ALL值作爲參數並更新行的過程。

我正在使用SQL Server。表中沒有BLOBS。

感謝/ M

+0

你在一個100列以上的表中存儲什麼類型的數據? – 2009-08-19 20:45:01

+0

其實我沒有統計有多少列,但有很多。數據模型沒問題,只是表格中的實體有很多屬性。 – 2009-08-19 20:51:02

回答

1

選項2和3在更新時需要更多數據傳輸到服務器 - 因此對於數據而言通信開銷較大。

每行是否有一組不同的更新列,或者是對任何給定的運行更新相同的列集(但列表可能因運行而異)?在後一種情況下(在給定運行中更新了相同的一組列),則選項1可能表現更好;而在後一種情況下(在給定運行中更新相同的一組列)該聲明將被準備一次,並且每次更新都會使用很多次,並且每次更新都將最少的數據傳輸到服務器。

在前一種情況下,我會查看是否有相對較小的子集被更改(例如,在不同行中更改了10列,即使任何一行只更改了其中的3列10)。在這種情況下,我可能會參數化爲10列,接受傳輸7-9列值相對較小的開銷,爲了方便單個預準備語句,它們沒有改變。如果更新列的集合遍佈整個地圖(例如,在整個操作中更新了100列中的50列以上),那麼處理整個地段可能更簡單。

在某種程度上,它取決於您的主機語言(客戶端API)如何輕鬆地處理參數化更新的各種可能方式。

4

我要說號2和3是從性能的角度相等。如果您使用PK來確定要更新哪一行並且它是一個集羣鍵,那麼我不會擔心將列更新爲自己。第一種情況的問題是,你將導致「過程緩存膨脹」,你有很多類似的計劃都會佔用你的計劃緩存,因爲它們與更新稍有不同。

如果你打算做大規模的更新,我會毫不猶豫地推薦更新所有列,因爲它可能會導致FK查找UPS等

感謝, 埃裏克

+0

即使FK的值未更改,更新是否會導致FK查找? – 2009-08-19 20:53:00

+0

我認爲它不會如果你自己設置一列,但我不確定。讓我檢查並回復你。 – Anon246 2009-08-19 21:17:20

+1

即使您更新爲相同的值,也會出現查找。因此,在FK指向其他表的表上執行大量更新可能會導致掃描或尋找其他表。 (也是一個很好的理由,以確保你所有的PK/FK組合都被編入索引)。 – Anon246 2009-08-19 21:51:27

0

我投票的p .1與p.2混合使用,即動態構建參數化的UPDATE語句,該語句將只更新更改的列。當你的讀/寫速率在'read'一側,並且你沒有太頻繁地更新更新時,這將適用於這種情況,所以我們可以安全地爲(物理)更新性能交換查詢計劃緩存。