¿Cómo Postgres dispara las escalas del mecanismo?
Tenemos una gran instalación de PostgreSQL e intentamos implementar un sistema basado en eventos utilizando tablas de registro y TRIGGER (s).
Básicamente nos gustaría crear un GATILLO para cada tabla que queremos que se nos notifique para una operación ACTUALIZAR / INSERTAR / BORRAR. Una vez que se active este disparador, ejecutará una función que simplemente agregará una nueva fila (codificando el evento) a una tabla de registro que luego sondearemos desde un servicio externo.
Antes de comenzar con TRIGGER (s) de Postgres, nos gustaría saber cómo se escalan: ¿cuántos disparadores podemos crear en una sola instalación de Postgres? ¿Afectan el rendimiento de la consulta? ¿Alguien ha intentado esto antes?
fuente
Respuestas:
Ese es un uso bastante estándar para un disparador.
Si sigue creándolos, eventualmente se quedará sin espacio en disco.
No hay un límite específico para los desencadenantes.
Los límites de PostgreSQL están documentados en la página acerca de .
Depende del tipo de disparador, el idioma del disparador y lo que hace el disparador.
Un simple
BEFORE ... FOR EACH STATEMENT
disparador PL / PgSQL que no hace nada tiene una sobrecarga cercana a cero.FOR EACH ROW
los disparadores tienen una sobrecarga mayor que losFOR EACH STATEMENT
disparadores. Escalado, obviamente, con los recuentos de filas afectados.AFTER
los desencadenantes son más caros que losBEFORE
desencadenantes porque deben ponerse en cola hasta que la instrucción termine de hacer su trabajo y luego ejecutarse. No se derraman en el disco si la cola se hace grande (al menos en 9.4 y posteriores, puede cambiar en el futuro), por lo que lasAFTER
colas de activación enormes pueden hacer que la memoria disponible se desborde, lo que resulta en la anulación de la instrucción.Un activador que modifica la
NEW
fila antes de insertar / actualizar es más barato que un activador que hace DML.El caso de uso específico que desee funcionaría mejor con una mejora en progreso que podría convertirse en PostgreSQL 9.5 (si tenemos suerte), donde los
FOR EACH STATEMENT
desencadenantes pueden ver tablasOLD
y virtualesNEW
. Esto no es posible en las versiones actuales de PostgreSQL, por lo que debe usarFOR EACH ROW
desencadenantes.Por supuesto. Es un uso bastante estándar para los desencadenantes, junto con auditorías, comprobación de cordura, etc.
Deberá buscar
LISTEN
y encontrarNOTIFY
una buena manera de despertar a su trabajador cuando ocurran cambios en la tabla de tareas.Ya estás haciendo lo más importante al evitar hablar con sistemas externos directamente desde los disparadores. Eso tiende a ser problemático para el rendimiento y la fiabilidad. Las personas a menudo intentan hacer cosas como enviar correo directamente desde un disparador, y esas son malas noticias.
fuente
Es una respuesta un poco tardía, pero podría ser útil para futuros lectores.
Hoy en día (en las versiones 10,11,12) no necesitamos almacenar los mismos datos dos veces (en WAL by PG y manualmente). Podemos usar la mecánica de decodificación lógica de Postgre (igual que la replicación lógica) para rastrear todos o algunos cambios en nuestros datos (o enviar esos eventos a alguna cola como kafka para analizarlos más adelante)
fuente