我正在處理一個窗體,它有一個編輯現有記錄的用戶有很多字段。用戶可能只更改了一個字段,我通常會執行更新查詢來設置所有字段的值,即使其中大多數字段都不會更改。我可以做一些跟蹤來查看哪些字段實際上已經改變,並且只更新那些做過的。更新記錄中的所有字段與僅更改記錄中的所有字段之間存在性能差異?有沒有其他的理由去用這兩種方法?霰彈槍的方法很簡單...(我的)SQL性能:更新一個字段vs許多不必要的字段
9
A
回答
7
我會說,這取決於以下情況:
- 數據正被 處理
- 數據庫服務器 相對於拍攝的應用
- 時的位置大小完成任何檢查 數據更改
如果您正在傳輸大量的數據和/或連接是遠程的,那麼你應該做一些測試,看看你是否可以通過跟蹤更改來提高性能。否則,假設正在處理一條記錄,您可能會發現它可以忽略不計。
1
在更新多個字段中當然會有一些開銷,但與維護關於哪些字段發生更改的狀態相比,開銷會很小。如果這是1個表格,我不會擔心根據表單的狀態選擇性地更新列。
另外,查看一個像Hibernate這樣的數據庫框架來抽象這些細節可能是有用的。
0
我會去霰彈槍的方法廣告很容易理解和實施。性能受到影響應該是可以忽略的。
2
如果您在談論合理數量的數據(例如1kb +),那麼優化可能是值得的。如果這個語句/表正在頻繁地運行/更新(每秒幾次?),多個用戶等等,這可能是值得優化的。
您應該已經擁有原始數據的副本,因此確定發生了什麼變化並不是什麼大問題,也不會更改update語句以僅適應已更改的字段。
因此,這可能不是一個壞主意,但除非您希望節省帶寬,或者認爲您需要提高性能,否則可能沒有必要。
3
我會說爲霰彈槍去,但它真的取決於許多事情和你在數據庫中的使用。
- 一個用戶還是百萬併發用戶?
- 字段太小還是有大的文本/ blob字段?
- 表單在數據庫附近或通過網絡或網絡填充的應用程序?
你必須要考慮到的是,UPDATE
將不得不不僅存儲新的(甚至是不變的)字段轉換表,而且還在:
- 檢查外鍵約束
- 更新更新字段上的所有索引
但是,在所有情況下,您都可以實施簡單的方法並測試任何性能問題以確保安全。
1
您實際上可能會因僅更新單個字段而失去性能。如果您使用的是準備好的語句,那麼數據庫已經編譯了更新所有字段的查詢計劃。如果您開始更新隨機字段,則每次更新時都必須解析查詢,從而失去了準備好的語句的好處。我不確定這會對MySQL有多大的影響,但我知道這對SQL Server和Oracle來說可能很重要。
相關問題
- 1. Hibernate是一個更新許多到許多不必要的
- 2. MYSQL從另一個表的字段更新多個字段
- 3. 不允許不必要的字符在字段中輸入
- 4. 添加SQL Server數字字段並更新另一個字段?
- 5. Json有多個字段中的一個必填字段
- 6. HTML5必要屬性兩個字段
- 7. SQL - 使用另一個字段的字符串的一部分更新字段
- 8. sql不同,需要多個字段
- 9. SQL - 更新字段
- 10. 如何更新一個mongodb字段而不必爲每個單獨的字段更新單個路由?
- 11. 更新SQL中的字段
- 12. 更新多個字段
- 13. 更新多個字段
- 14. 私人類字段的必要性
- 15. SQL更新(不能更新超過1個字段)
- 16. 更新一個表中有多個字段的SQL語句
- 17. 更新字段,其中使用下面的查詢來更新我的字段字段不能小於零
- 18. 更新其他字段的值更改一個字段的值
- 19. 只允許一個實例字段但需要更多?
- 20. T-SQL如何從另一個nvarchar字段更新一個int字段的值
- 21. 休眠 - 生成的SQL包含多個字段比我更新
- 22. 使用ekmett的鏡頭更新字段的多個子字段
- 23. 另一個字段更改的HTML表單字段更新
- 24. 爲什麼JPA生成的更新查詢包含比必要的字段更多的字段?
- 25. 更新一個空字段
- 26. 具有多個字段的Solr性能
- 27. SQL:更新字段在另一個字段的唯一值上循環
- 28. ACRA報告字段 - 不能添加更多的報告字段
- 29. 一個屬性的多個字段
- 30. SOLR - 依賴於另一個字段的字段值更新某個字段值
我對具體表現的答案感興趣。不過,我想你自己說過了 - *霰彈槍的方法很簡單*。也就是說,國際海事組織無論單場更新提供什麼樣的優化,它都值得追蹤的開銷。性能是一個平衡。 –
MySQL會檢測一個字段是否沒有改變,並且沒有做任何額外的工作,所以開銷並沒有你想象的那麼糟糕。 – Johan
謝謝大家。 – changokun