PostgreSQL. Являются ли триггеры BEFORE более эффективными, чем триггеры AFTER? - PullRequest
6 голосов
/ 28 марта 2011

Я только что прочитал в документации PostgreSQL - Обзор поведения триггера , что ПЕРЕД триггерами "более эффективны", чем триггеры ПОСЛЕ:

Если у вас нет особых причин длясделать триггер до или после, предыдущий регистр более эффективен, так как информация об операции не должна быть сохранена до конца инструкции.

Я не понимаю, верно ли это иличто это значит для меня.Может ли кто-нибудь просветить меня?Это просто улучшение гомеопатических показателей?

Ответы [ 3 ]

6 голосов
/ 28 марта 2011

Из-за архитектуры PostgreSQL MVCC каждая операция увеличивает объем данных, записанных в системе, даже DELETE.

Так что, если вам просто нужно проверить свои входные данные иоткат транзакции, если проверки не пройдены, лучше сделать это до сохранения входных данных.

2 голосов
/ 28 марта 2011

Для триггера обновления я не обнаружил заметных различий в моей системе:

с триггером «до»:

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;

с триггером «после»:

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

Но по какой-то причине я получаю очень заметное ухудшение с триггером «до» вставки по сравнению с триггером «после» вставки или элементом управления

1 голос
/ 28 марта 2011

Единственный способ доказать это тем или иным способом - проверить это и посмотреть, имеет ли это значение для того, что вы делаете.

Логическое мышление на высоком уровне ... если вы делаете дополнительный шаг, чтобы сохранить больше информации, по сравнению с отсутствием дополнительного шага, конечно, один - это больше работы, чем другой. Так же, как ходьба на один дополнительный шаг - это больше работы, даже если она не займет у вас заметной разницы во времени. Например, пройти 10 футов с 10 шагами против 11 шагов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...