我刚刚在PostgreSQL Documentation - Overview of Trigger behavior中读到,BEFORE触发器比AFTER触发器“更有效”:
如果您没有具体的理由 之前或之后的触发器,之前的触发器 案例更有效率,因为 有关操作的信息 不必保存到结束 言。
我不明白这是真的还是对我来说意味着什么。有人可以开导我吗?这只是一种逆转性能改善吗?
答案 0 :(得分:6)
由于PostgreSQL
的{{1}}架构,每项操作都会增加系统中记录的数据量,甚至MVCC
。
因此,如果您只需检查输入并在检查失败时回滚事务,则最好在保存输入数据之前执行此操作。
答案 1 :(得分:2)
对于更新触发器,我发现我的系统没有可测量的差异:
使用'before'触发器:
begin;
create function f() returns trigger language plpgsql as $$
begin
new.time_of_day:=old.time_of_day+'1d'::interval;
return new;
end;$$;
create table t(time_of_day timestamp);
insert into t(time_of_day)
select timeofday()::timestamp from generate_series(1,100000);
update t set time_of_day = timeofday()::timestamp;
select max(time_of_day)-min(time_of_day) from t;
?column?
-----------------
00:00:47
create trigger trig before insert on t for each row execute procedure f();
update t set time_of_day = timeofday()::timestamp;
select max(time_of_day)-min(time_of_day) from t;
?column?
-----------------
00:00:47.432173
rollback;
带'after'触发器:
create function f() returns trigger language plpgsql as $$
begin
new.time_of_day:=old.time_of_day+'1d'::interval;
return new;
end;$$;
create table t(time_of_day timestamp);
insert into t(time_of_day)
select timeofday()::timestamp from generate_series(1,100000);
update t set time_of_day = timeofday()::timestamp;
select max(time_of_day)-min(time_of_day) from t;
?column?
-----------------
00:00:48.566558
create trigger trig after insert on t for each row execute procedure f();
update t set time_of_day = timeofday()::timestamp;
select max(time_of_day)-min(time_of_day) from t;
?column?
-----------------
00:00:48.922441
但出于某种原因,与'after'插入触发器或控件
相比,我得到一个非常明显的降级带有'before' insert 触发器答案 2 :(得分:1)
你要以某种方式证明它的唯一方法是测试它,看看它对你正在做的事情是否重要。
从逻辑上思考高层......如果你采取额外措施来保留更多信息而不采取额外步骤,那么一项工作比另一项更多。就像步行一个额外的步骤更多的工作,即使它可能不会带你明显的时差。例如,步行10英尺,10步,11步。