Postgresql

更新具有相同值的行實際上會更新該行嗎?

  • April 7, 2021

我有一個與性能相關的問題。假設我有一個名字為 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,請使用簡單的相等檢查,不過這樣會便宜一些。

有關的:

引用自:https://dba.stackexchange.com/questions/118178