기본적으로 우리는 UPDATE / INSERT / DELETE 작업에 대해 통지하고자하는 각 테이블에 대해 TRIGGER를 작성하려고합니다. 이 트리거가 발생하면 단순히 새로운 행 (이벤트 인코딩)을 로그 테이블에 추가하여 외부 서비스에서 폴링 할 함수를 실행합니다.
그것은 트리거에 대한 표준 사용입니다.
Postgres TRIGGER를 시작하기 전에 단일 Postgres 설치에서 얼마나 많은 트리거를 생성 할 수 있습니까?
계속 생성하면 디스크 공간이 부족하게됩니다.
트리거에는 특정 제한이 없습니다.
PostgreSQL 제한은 about 페이지에 설명되어 있습니다.
쿼리 성능에 영향을 줍니까?
트리거 유형, 트리거 언어 및 트리거의 기능에 따라 다릅니다.
BEFORE ... FOR EACH STATEMENT
아무것도하지 않는 간단한 PL / PgSQL 트리거는 오버 헤드가 거의 없습니다.
FOR EACH ROW
트리거는 트리거보다 오버 헤드가 높습니다 FOR EACH STATEMENT
. 영향을받는 행 수로 확장합니다.
AFTER
트리거는 BEFORE
명령문이 작업을 완료 한 후 실행될 때까지 큐에 대기해야하므로 트리거 보다 비쌉니다 . 큐가 커지면 (최소 9.4 이하, 향후 변경 될 AFTER
수 있음 ) 디스크에 쏟아지지 않으므로 방대한 트리거 큐로 인해 사용 가능한 메모리가 초과되어 명령문이 중단 될 수 있습니다.
NEW
삽입 / 업데이트 전에 행 을 수정 하는 트리거는 DML을 수행하는 트리거보다 저렴합니다.
FOR EACH STATEMENT
트리거가 가상 OLD
및 NEW
테이블을 볼 수 있는 PostgreSQL 9.5 (행운이있는 경우)로 만들 수있는 진행중인 향상 기능을 사용하면 원하는 특정 사용 사례가 더 잘 수행 됩니다. 현재 PostgreSQL 버전에서는 불가능하므로 FOR EACH ROW
트리거를 대신 사용해야 합니다.
아무도 전에 이것을 시도 했습니까?
물론이야. 감사, 온 전성 검사 등과 함께 트리거에 대한 표준 사용입니다.
당신은 보길 원하는 것입니다 LISTEN
및 NOTIFY
작업 테이블에 대한 변경이 일어날 때 노동자를 깨울 수있는 좋은 방법에 대해.
트리거에서 직접 외부 시스템과 통신하는 것을 피함으로써 이미 가장 중요한 일을하고 있습니다. 이는 성능과 신뢰성에 문제가되는 경향이 있습니다. 사람들은 종종 방아쇠에서 직접 메일을 보내는 것과 같은 일을 시도하지만 나쁜 소식입니다.