update 敘述必須搬移被改動的索引條目以維持索引順序:資料庫得移除舊條目,再把新條目加到新位置。
因此
update的回應時間,基本上等於對應的delete加insert的總和。
與 insert / delete 的關鍵差異#
update 效能同樣取決於表上的索引數量,唯一差別是:它未必影響所有欄位——update 往往只修改少數幾個欄位,因而只影響「包含被更新欄位」的那些索引。
圖 8.3 比較兩段 update:一段設定所有欄位、影響所有索引,另一段只更新單一欄位、因而只影響一個索引。

圖 8.3:依索引數與欄位數的 update 效能
「更新所有欄位」呈現前面各節已經看過的相同模式:回應時間隨每多一個索引而增加。「只影響一個索引」的那段則上升有限——因為它讓多數索引維持不變。
實務建議:只更新真正改動的欄位#
要優化 update 效能,你必須留意只更新那些真的被改動的欄位。
手寫 update 時這是理所當然的,但 ORM 工具可能每次都產生「設定所有欄位」的 update。
例如 Hibernate 在停用
dynamic-update模式時就會這麼做。(自 4.0 版起,該模式預設為啟用。)
使用 ORM 工具時,偶爾在開發環境開啟查詢記錄、檢查產生的 SQL 敘述,是很好的習慣。第 4 章「開啟 SQL logging」一節簡述了幾個常見 ORM 的開啟方式。