W jaki sposób Postgres wyzwala skalę mechanizmu?
Mamy dużą instalację PostgreSQL i staramy się zaimplementować system oparty na zdarzeniach, używając tabel dzienników i wyzwalaczy.
Zasadniczo chcielibyśmy utworzyć TRIGGER dla każdej tabeli, dla której chcemy być powiadamiani o operacji UPDATE / INSERT / DELETE. Gdy ten wyzwalacz zostanie uruchomiony, wykona funkcję, która po prostu doda nowy wiersz (kodowanie zdarzenia) do tabeli dziennika, którą następnie sondujemy z usługi zewnętrznej.
Przed przystąpieniem do all-inu z wyzwalaczami Postgres chcielibyśmy wiedzieć, jak się skalują: ile wyzwalaczy możemy stworzyć w ramach jednej instalacji Postgres? Czy wpływają na wydajność zapytań? Czy ktoś wcześniej tego próbował?
postgresql
performance
query-performance
scalability
Ugo Matrangolo
źródło
źródło
Odpowiedzi:
To dość standardowe użycie wyzwalacza.
Jeśli będziesz je dalej tworzyć, w końcu zabraknie Ci miejsca na dysku.
Nie ma określonego limitu wyzwalaczy.
Limity PostgreSQL są udokumentowane na stronie about .
Zależy to od typu wyzwalacza, języka wyzwalacza i jego działania.
Prosty
BEFORE ... FOR EACH STATEMENT
wyzwalacz PL / PgSQL, który nic nie robi, ma narzut bliski zeru.FOR EACH ROW
wyzwalacze mają wyższy narzut niżFOR EACH STATEMENT
wyzwalacze. Skalowanie, oczywiście, z liczonymi wierszami.AFTER
wyzwalacze są droższe niżBEFORE
wyzwalacze, ponieważ muszą być ustawione w kolejce, dopóki instrukcja nie zakończy wykonywania swojej pracy, a następnie wykonane. Nie są one rozlewane na dysk, jeśli kolejka się powiększy (przynajmniej w wersji 9.4 i niższej może się zmienić w przyszłości), więc ogromneAFTER
kolejki wyzwalające mogą spowodować przepełnienie dostępnej pamięci, co powoduje przerwanie instrukcji.Wyzwalacz, który modyfikuje
NEW
wiersz przed wstawieniem / aktualizacją, jest tańszy niż wyzwalacz, który wykonuje DML.Konkretny przypadek użycia, który chcesz, działałby lepiej dzięki ulepszeniu w toku, które może przekształcić go w PostgreSQL 9.5 (jeśli mamy szczęście), gdzie
FOR EACH STATEMENT
wyzwalacze mogą zobaczyć wirtualnyOLD
iNEW
tabele. Nie jest to możliwe w obecnych wersjach PostgreSQL, dlategoFOR EACH ROW
zamiast tego należy użyć wyzwalaczy.Oczywiście. Jest to dość standardowe zastosowanie do wyzwalaczy, wraz z audytem, sprawdzaniem czystości itp.
Będziesz chciał przyjrzeć się
LISTEN
iNOTIFY
znaleźć dobry sposób na obudzenie pracownika, gdy nastąpią zmiany w tabeli zadań.Już robisz najważniejszą rzecz, unikając rozmowy z systemami zewnętrznymi bezpośrednio z wyzwalaczy. Jest to zwykle problematyczne pod względem wydajności i niezawodności. Ludzie często próbują robić rzeczy takie jak wysyłanie poczty bezpośrednio z wyzwalacza, a to złe wieści.
źródło
To nieco spóźniona odpowiedź, ale może być przydatna dla przyszłych czytelników
Teraz dni (w wersjach 10,11,12) nie musimy przechowywać tych samych danych dwa razy (w WAL przez PG i ręcznie). Możemy użyć mechaniki Postgre Logical Decoding (tak samo jak replikacja logiczna), aby śledzić wszystkie lub niektóre zmiany naszych danych (lub wysłać te zdarzenia do jakiejś kolejki, takiej jak kafka, aby przeanalizować później)
źródło