Database 用相同的值更新一行实际上会更新该行吗?
我有一个与性能相关的问题。假设我有一个名为Michael的用户。以下面的查询为例:Database 用相同的值更新一行实际上会更新该行吗?,database,postgresql,sql-update,database-performance,postgresql-performance,Database,Postgresql,Sql Update,Database Performance,Postgresql Performance,我有一个与性能相关的问题。假设我有一个名为Michael的用户。以下面的查询为例: UPDATE users SET first_name = 'Michael' WHERE users.id = 123 查询是否实际执行更新?如果是这样,我如何防止它发生?是的,这样做更有效 UPDATE users SET first_name = 'Michael' WHERE users.id = 123 and (first_name <> 'Michael' or first_name
UPDATE users
SET first_name = 'Michael'
WHERE users.id = 123
查询是否实际执行更新?如果是这样,我如何防止它发生?是的,这样做更有效
UPDATE users
SET first_name = 'Michael'
WHERE users.id = 123
and (first_name <> 'Michael' or first_name is null)
更新用户
SET first_name='Michael'
其中users.id=123
和(名字“Michael”或名字为空)
它可以带来很大的不同。不仅仅是更新本身的时间-它不必采取am更新锁定 默认情况下,PostgreSQL中的
更新
不会检查原始值和新值之间的差异。您可以在更新前使用触发器跳过无用的更新:
CREATE OR REPLACE FUNCTION public.update_trigger_skip()
RETURNS trigger
LANGUAGE plpgsql
AS $function$
BEGIN
IF old IS NOT DISTINCT FROM new THEN
RETURN NULL;
END IF;
RETURN new;
END;
$$;
-- run this trigger as first - start name with "_"
CREATE TRIGGER _omega_update_skip BEFORE UPDATE ON omega;
FOR EACH ROW EXECUTE PROCEDURE update_trigger_skip();
PostgreSQL根据触发器的名称按顺序执行触发器。此解决方案简单且通用,速度慢(如果您使用大量更新,则可以对少数更新行进行调整)。触发器执行的开销很大。如果可以,修改您的查询,然后执行@Frisbee所描述的操作。从技术上讲,必须这样做。如果db决定“嘿,这些值是一样的,我就假装我改变了东西”。当然是的!如果您不想这样做,您必须在之前进行测试,并更新If different.x-posted to dba.SE:可能您的意思是和名字“Michael”
?这不仅仅是锁的问题。更新需要三个磁盘I/O(每页)。避免幂等更新可以避免它们。(在页面的基础上)再想一想:可能是四个I/O。一般来说,这是最简单的答案,切中要害。我想说,这是一个经验法则与更新。但是,当您真的想更新时,请注意这种情况(例如,您可能需要在更新时执行触发器,无论值是否真正更改)。如果first_name
可以为空,这可能是一个潜在的错误。考虑一下我对X-P贴问题的回答:我只是错过了。Add或为空。