Как Postgres запускает механизм весов?
У нас большая установка PostgreSQL, и мы пытаемся реализовать систему, основанную на событиях, используя таблицы журналов и TRIGGER (s).
По сути, мы хотели бы создать TRIGGER для каждой таблицы, которую мы хотим получать для операции UPDATE / INSERT / DELETE. Как только этот триггер сработает, он выполнит функцию, которая просто добавит новую строку (кодирующую событие) в таблицу журнала, которую мы затем опросим из внешней службы.
Прежде чем идти в олл-ин с Postgres TRIGGER, нам хотелось бы узнать, как они масштабируются: сколько триггеров мы можем создать в одной установке Postgres? Влияют ли они на производительность запросов? Кто-нибудь раньше пробовал это?
postgresql
performance
query-performance
scalability
Уго Матранголо
источник
источник
Ответы:
Это довольно стандартное использование для триггера.
Если вы продолжите создавать их, в конечном итоге вам не хватит места на диске.
Там нет конкретного ограничения для триггеров.
Ограничения PostgreSQL документированы на странице about .
Это зависит от типа триггера, языка триггера и того, что делает триггер.
Простой
BEFORE ... FOR EACH STATEMENT
триггер PL / PgSQL, который ничего не делает, имеет почти нулевые издержки.FOR EACH ROW
триггеры имеют более высокие издержки, чемFOR EACH STATEMENT
триггеры. Масштабирование, очевидно, с учетом количества строк.AFTER
триггеры дороже, чемBEFORE
триггеры, потому что они должны быть поставлены в очередь, пока оператор не завершит свою работу, а затем исполнится. Они не выводятся на диск, если очередь становится большой (по крайней мере, в 9.4 и ниже, может измениться в будущем), поэтому огромныеAFTER
очереди запуска могут привести к переполнению доступной памяти, что приведет к прерыванию оператора.Триггер, который изменяет
NEW
строку перед вставкой / обновлением, дешевле, чем триггер, который выполняет DML.Конкретный вариант использования, который вы хотите, будет лучше работать с улучшением, которое может быть реализовано в PostgreSQL 9.5 (если нам повезет), где
FOR EACH STATEMENT
триггеры могут видеть виртуальныеOLD
иNEW
таблицы. Это невозможно в текущих версиях PostgreSQL, поэтому вы должны использоватьFOR EACH ROW
триггеры.Конечно. Это довольно стандартное использование для триггеров, наряду с аудитом, проверкой работоспособности и т. Д.
Вы захотите изучить
LISTEN
иNOTIFY
найти хороший способ разбудить вашего работника, когда произойдут изменения в таблице задач.Вы уже делаете самое важное, избегая общения с внешними системами напрямую от триггеров. Это имеет тенденцию быть проблематичным для производительности и надежности. Люди часто пытаются сделать что-то вроде отправки почты прямо из триггера, и это плохие новости.
источник
Это немного запоздалый ответ, но он может быть полезен для будущих читателей
Сейчас (в версиях 10,11,12) нам не нужно хранить одни и те же данные дважды (в WAL PG и вручную). Мы можем использовать механику Postgre Logical Decoding ( такую же, как логическая репликация), чтобы отслеживать все или некоторые изменения в наших данных (или отправлять эти события в некоторую очередь, например, kafka, для последующего анализа).
источник