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

时间:2015-10-15 19:17:00

标签: database postgresql sql-update database-performance postgresql-performance

我有一个与绩效相关的问题。我们假设我的用户名为迈克尔。请进行以下查询:

UPDATE users
SET first_name = 'Michael'
WHERE users.id = 123

查询是否会实际执行更新?如果是这样,我该如何防止它发生?

2 个答案:

答案 0 :(得分:2)

是的,这样做效率更高

UPDATE users
SET first_name = 'Michael'
WHERE users.id = 123 
and (first_name <> 'Michael' or first_name is null)

它可以产生很大的不同 不只是更新本身的时间 - 它不必采取更新锁定。

答案 1 :(得分:2)

PostgreSQL中的UPDATE默认情况下不会检查原始值和新值之间的差异。您可以使用BEFORE UPDATE触发器跳过无用的更新:

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描述。