@netW0rm

Как оптимизировать такой триггер в PostgreSQL?

Есть такая триггерная функция
CREATE OR REPLACE FUNCTION update()
RETURNS trigger AS $$
BEGIN
NEW.f1 := some_value();
NEW.updated_at := now(); -- now() будет выполняться на каждой строке?
RETURN NEW;
END;
$$ LANGUAGE plpgsql  VOLATILE

И триггер
CREATE TRIGGER tg_update
BEFORE INSERT OR UPDATE
ON my_table
FOR EACH ROW
EXECUTE PROCEDURE update();

Хочу сделать несколько оптимизаций для лучшей производительности:
1) поле updated_at должно обновляться только при операции UPDATE
проверять TG_OP или делать дополнительный триггер или еще как-то, что будет эффективней? Тут важно, чтобы эффективней работал UPDATE, INSERT не критичен.
2) если триггер выполняется на большем кол-ве строк операция now() будет вызываться на каждой из них? Может можно както определить переменную, в которую поместить результат now() перед вызовом триггера ? Или както через систему правил создать дополнительный запрос, или ... ?

Если честно, только вчера сел читать документацию по триггерам и процедурным языкам и пока не очень соображаю)
  • Вопрос задан
  • 492 просмотра
Пригласить эксперта
Ответы на вопрос 1
terrier
@terrier
проверять TG_OP или делать дополнительный триггер

Да, в общем-то и так и так нормально, смотрите как будет более читаемо

если триггер выполняется на большем кол-ве строк операция now() будет вызываться на каждой из них?

Да, собственно, как и написано в объявлении триггера "FOR EACH ROW", то бишь для каждой измененной строки. Ну, конкретно по поводу now() я бы сильно не волновался, это же время на начало транзакции, оно не меняется, то есть, скорее всего просто достается число из ближнего кэша. А вот если бы там была длительная операция вместо now(), вы бы ее в триггер не засунули бы, верно?

Впрочем, если вам принципиально проставлять время один раз для одного SQL-запроса, то можно объявить триггер "FOR EACH STATEMENT", он будет выполняться один раз для каждого запроса. Но в нем, понятное дело недоступны таблицы OLD и NEW, то есть каким-то отдельным запросом надо время проставлять
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы