Postgresql 是否为不变更新语句创建一个新元组?

Gri*_*cey 2 postgresql postgresql-performance

我需要修复 Postgresql 数据库中的一些数据问题,其中主要是从文本列中修剪空格。我正在使用如下语句执行此操作:

UPDATE app.products
SET "description" = TRIM(BOTH FROM "description")
Run Code Online (Sandbox Code Playgroud)

在测试数据库上发出这个返回UPDATE 2000. 测试表包含 2000 行,其中只有 1 行实际上会随着空白修剪而改变。这是否会导致 Postgres 创建新的、不必要的元组?添加 WHERE 子句会有好处吗?大多数目标列都没有编入索引。

UPDATE app.products
SET "description" = TRIM(BOTH FROM "description")
WHERE "description" LIKE ' %' OR "description" LIKE '% '
Run Code Online (Sandbox Code Playgroud)

Lau*_*lbe 6

是的,这将修改所有行,即使值没有改变。

如果您想避免这种情况,请使用WHERE条件:

UPDATE app.products
SET "description" = TRIM(BOTH FROM "description")
WHERE "description" IS DISTINCT FROM TRIM(BOTH FROM "description");
Run Code Online (Sandbox Code Playgroud)

或者使用suppress_redundant_updates_trigger()触发器函数BEFORE UPDATE在表上定义触发器。

避免不必要的更新将提高性能并减少表膨胀。

  • 在可能为 NULL 的情况下,最好使用 IS DISTINCT FROM (2认同)