update 敘述必須搬移被改動的索引條目以維持索引順序:資料庫得移除舊條目,再把新條目加到新位置。

因此 update 的回應時間,基本上等於對應的 deleteinsert 的總和。

與 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 的開啟方式。