Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Database 用相同的值更新一行实际上会更新该行吗?_Database_Postgresql_Sql Update_Database Performance_Postgresql Performance - Fatal编程技术网

Database 用相同的值更新一行实际上会更新该行吗?

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

我有一个与性能相关的问题。假设我有一个名为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 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或为空。