加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

postgresql – 更新具有相同值的行是否实际更新了行?

发布时间:2020-12-13 16:20:25 所属栏目:百科 来源:网络整理
导读:我有一个与绩效相关的问题.假设我有一个名叫迈克尔的用户.采取以下查询: UPDATE usersSET first_name = 'Michael'WHERE users.id = 123 查询是否会实际执行更新,即使它正在更新为相同的值?如果是这样,我该如何防止它发生? 由于Postgres的 MVCC model,并且
我有一个与绩效相关的问题.假设我有一个名叫迈克尔的用户.采取以下查询:
UPDATE users
SET first_name = 'Michael'
WHERE users.id = 123

查询是否会实际执行更新,即使它正在更新为相同的值?如果是这样,我该如何防止它发生?

由于Postgres的 MVCC model,并且根据SQL的规则,UPDATE为WHERE子句中未排除的每一行写入新的行版本.

这确实对性能产生了或多或少的直接或间接影响. “空更新”与每个任何其他更新具有相同的每行成本.它们像任何其他更新一样触发触发器(如果存在),它们必须是WAL-logged并且它们会产生死行,使得表格膨胀,并且像其他任何更新一样导致VACUUM的更多工作.

索引条目和TOASTed列(其中没有更改任何列)可以保持不变,但对于任何更新的行都是如此.有关:

> PostgreSQL Initial Database Size
> Redundant data in update statements

排除这样的空更新几乎总是一个好主意(当有可能发生这种情况时).你没有在你的问题中提供表格定义(这总是一个好主意).我们必须假设first_name可以为NULL(这对于“名字”来说并不奇怪),因此查询必须使用NULL-safe comparison:

UPDATE users
SET    first_name = 'Michael'
WHERE  id = 123
AND first_name IS DISTINCT FROM 'Michael';

如果在更新之前first_name为NULL,则仅使用first_name<>进行测试’Michael’将评估为NULL,因此从更新中排除该行.偷偷摸摸的错误.如果该列是defined NOT NULL,则使用简单的相等性检查,因为这样便宜一点.

有关:

> How do I (or can I) SELECT DISTINCT on multiple columns?
> SQL Update column with data from another table

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读