2011-06-23 73 views
9

我正在處理一個窗體,它有一個編輯現有記錄的用戶有很多字段。用戶可能只更改了一個字段,我通常會執行更新查詢來設置所有字段的值,即使其中大多數字段都不會更改。我可以做一些跟蹤來查看哪些字段實際上已經改變,並且只更新那些做過的。更新記錄中的所有字段與僅更改記錄中的所有字段之間存在性能差異?有沒有其他的理由去用這兩種方法?霰彈槍的方法很簡單...(我的)SQL性能:更新一個字段vs許多不必要的字段

+0

我對具體表現的答案感興趣。不過,我想你自己說過了 - *霰彈槍的方法很簡單*。也就是說,國際海事組織無論單場更新提供什麼樣的優化,它都值得追蹤的開銷。性能是一個平衡。 –

+3

MySQL會檢測一個字段是否沒有改變,並且沒有做任何額外的工作,所以開銷並沒有你想象的那麼糟糕。 – Johan

+0

謝謝大家。 – changokun

回答

7

我會說,這取決於以下情況:

  • 數據正被 處理
  • 數據庫服務器 相對於拍攝的應用
  • 時的位置大小完成任何檢查 數據更改

如果您正在傳輸大量的數據和/或連接是遠程的,那麼你應該做一些測試,看看你是否可以通過跟蹤更改來提高性能。否則,假設正在處理一條記錄,您可能會發現它可以忽略不計。

1

在更新多個字段中當然會有一些開銷,但與維護關於哪些字段發生更改的狀態相比,開銷會很小。如果這是1個表格,我不會擔心根據表單的狀態選擇性地更新列。

另外,查看一個像Hibernate這樣的數據庫框架來抽象這些細節可能是有用的。

0

我會去霰彈槍的方法廣告很容易理解和實施。性能受到影響應該是可以忽略的。

2

如果您在談論合理數量的數據(例如1kb +),那麼優化可能是值得的。如果這個語句/表正在頻繁地運行/更新(每秒幾次?),多個用戶等等,這可能是值得優化的。

您應該已經擁有原始數據的副本,因此確定發生了什麼變化並不是什麼大問題,也不會更改update語句以僅適應已更改的字段。

因此,這可能不是一個壞主意,但除非您希望節省帶寬,或者認爲您需要提高性能,否則可能沒有必要。

3

我會說爲霰彈槍去,但它真的取決於許多事情和你在數據庫中的使用。

  • 一個用戶還是百萬併發用戶?
  • 字段太小還是有大的文本/ blob字段?
  • 表單在數據庫附近或通過網絡或網絡填充的應用程序?

你必須要考慮到的是,UPDATE將不得不不僅存儲新的(甚至是不變的)字段轉換表,而且還在:

  • 檢查外鍵約束
  • 更新更新字段上的所有索引

但是,在所有情況下,您都可以實施簡單的方法並測試任何性能問題以確保安全。

1

您實際上可能會因僅更新單個字段而失去性能。如果您使用的是準備好的語句,那麼數據庫已經編譯了更新所有字段的查詢計劃。如果您開始更新隨機字段,則每次更新時都必須解析查詢,從而失去了準備好的語句的好處。我不確定這會對MySQL有多大的影響,但我知道這對SQL Server和Oracle來說可能很重要。

相關問題