Postgresql
更新具有相同值的行實際上會更新該行嗎?
我有一個與性能相關的問題。假設我有一個名字為 Michael 的使用者。進行以下查詢:
UPDATE users SET first_name = 'Michael' WHERE users.id = 123
查詢是否會實際執行更新,即使它被更新為相同的值?如果是這樣,我該如何防止它發生?
由於 Postgres 的MVCC 模型,並且根據 SQL 的規則,an為子句中未排除的每一
UPDATE
行寫入一個新的行版本。WHERE
這確實或多或少對性能產生了直接或間接的實質性影響。“空更新”的每行成本與任何其他更新相同。它們像任何其他更新一樣觸發觸發器(如果存在),它們必須進行WAL 日誌記錄,並且它們會產生使表膨脹的死行,並
VACUUM
像任何其他更新一樣為以後的工作帶來更多工作。未更改任何相關列的索引條目和TOASTed列可以保持不變,但對於任何更新的行都是如此。有關的:
排除此類空更新幾乎總是一個好主意(當有可能發生時)。您沒有在問題中提供表定義。我們必須假設
first_name
可以是 NULL(對於“名字”來說這並不奇怪),因此查詢必須使用NULL 安全比較:UPDATE users SET first_name = 'Michael' WHERE id = 123 **AND first_name IS DISTINCT FROM 'Michael';**
如果
first_name IS NULL
在更新之前,使用 just 的測試first_name <> 'Michael'
將評估為 NULL 並因此從更新中排除該行。偷偷摸摸的錯誤。如果該列已定義NOT NULL
,請使用簡單的相等檢查,不過這樣會便宜一些。有關的: