我有一个与绩效相关的问题。我们假设我的用户名为迈克尔。请进行以下查询:
UPDATE users
SET first_name = 'Michael'
WHERE users.id = 123
查询是否会实际执行更新?如果是这样,我该如何防止它发生?
答案 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描述。