Una función de activación más rápida es más ligera en C para PostgreSQL

Hemos escrito publicaciones de blog sobre cómo escribir extensiones de lenguaje C simples y un poco más complejas de Ibrar que han sido bien recibidas por la comunidad de usuarios de PostgreSQL. Luego observamos que muchos usuarios de PostgreSQL crean activadores simples para pequeñas necesidades de auditoría y luego sienten el dolor de activarlos en transacciones. Entonces, analicemos qué tan simple, ligera y rápida se escribe una función de activación en C. En general, las funciones de activación se escriben en lenguajes de alto nivel como PlpgSQL, pero tienen una sobrecarga mayor durante la ejecución y pueden afectar las transacciones, y así sucesivamente. . rendimiento de la aplicación.

Esta publicación de blog es un intento de crear una función de activación simple para abordar uno de los casos de uso común de los activadores, que es actualizar las columnas de auditoría en una tabla.

En esta publicación, presentaremos las características de SPI (Interfaz de programación del servidor) para nuevos usuarios. Hacia el final del blog, compartimos algunos de los resultados de referencia rápidos para comprender los beneficios.

Ejemplo de marca de tiempo de auditoría

Procedemos con tomar un caso y suponiendo que tenemos una tabla para guardar los detalles de la transacción. Pero los requisitos de auditoría dicen que debe haber una marca de tiempo en cada tupla cuando se inserta la tupla y cuándo se actualizó por última vez.

Para fines de demostración, elimine y corte las otras columnas y cree una tabla con solo 3 columnas esenciales.

Desarrollar la función de disparo

La función de activación también puede desarrollarse y empaquetarse como una extensión, de lo que hablamos en la publicación anterior del blog aquí. Así que no repitamos esos pasos aquí. La diferencia es que los nombres de archivo se llaman «trgr» en lugar de «addme» en el blog anterior. Makefile también se modifica para referirse a archivos «trgr». Este no debe ser el mismo que el nombre de la función «trig_test» en la fuente C que se detalla a continuación.

Finalmente, los siguientes archivos están disponibles en la carpeta de desarrollo:

Trgr.c son los principales archivos fuente con el siguiente contenido:

y
trgr0.0.1.sql con el siguiente contenido:

Ahora es cuestión de construir, instalar y crear la extensión.

En caso de que no quiera desarrollarlo como una extensión, puede compilarlo para generar un archivo de objeto común (.so). Copio lo mismo en la carpeta de la biblioteca binaria de PostgreSQL, que en mi laptop Ubuntu es: /usr/lib/postgresql/11/lib/, y luego defino la función. También puede especificar la ruta completa al archivo de objeto compartido de la siguiente manera:

Utilice la función de activación

El uso de la función de disparo no es diferente de las funciones regulares de PLpgSQL. Simplemente agregue la función a la tabla para todos los eventos INSERT y UPDATE.

evaluación comparativa

Para una comparación justa con la función de activación escrita en PLpgSQL, se crea una función similar de la siguiente manera:

El número de líneas y la legibilidad del código está a favor de PLpgSQL. El tiempo de desarrollo y depuración requerido es mucho menor.

En términos de benchmarking de desempeño, se comparan tres casos.

  1. Cliente / aplicación de PostgreSQL que proporciona la marca de tiempo de auditoría para que se pueda evitar el desencadenante.
  2. Función de activación del lenguaje C
  3. Función de disparo en PLpgSQL.

Aquí están los números de rendimiento en milisegundos por 1 millón de inserciones de masa, obviamente, un número más pequeño es mejor.


Advertencias

  1. El primer caso donde no hay disparador en el lado de la base de datos, toma menos tiempo. Pero la aplicación y la red deben asumir el cargo adicional, que no se considera en esta prueba.
  2. La función C está mal codificada con un número de atributo como
    número de atención = 3; y si queremos una función de activación genérica que busque un nombre de columna específico, podemos usarla SPI_fnúmero funcionan como
    número de atención = SPI_fnúmero(tupdesc,«actualizar_ts»); . Esta función de activación genérica se puede utilizar en muchas tablas. Obviamente, esto implica más transformaciones. Estas líneas están comentadas en el código fuente. En pruebas repetidas, el tiempo promedio de ejecución aumenta a 1826,722ms. Sin embargo, podemos ver que es considerablemente más rápido que la función de activación de PLpgSQL.

Discutir en Hacker News

Author: Ing. Luis

A lo largo de conocer Windows y otros sistemas operativos me eh encontrado con diversos tipos de error, ahora brindo soluciones según mi experiencia-

Deja un comentario