Haciendo Profiler a una función plpgsql

En varias ocasiones nos ha tocado hacer “Profiler”  a algún código que hemos realizado o han realizado otros, pero que es el “Profiler o Profiling”, no es más que es análisis  del comportamiento de un programa  o código,  con el objetivo de averiguar el tiempo dedicado a la ejecución de diferentes partes  para detectar los puntos críticos.

Lo que les traigo acá es una de las maneras de como hacer Profiler en PostgreSQL, no es la única, pero me ha llamado mucho la atención por su sencillez y la utilidad que puede brindar, específicamente en las funciones PLPGSQL, utilizando una extensión llamada plprofiler. Es promocionada y al parecer mantenida por la empresa openscg y publicada en su repositorio, la última actualización de la extensión es de 2015-02-15, y nos brinda una vista que muestra el oid, linea, veces de ejecución, el tiempo total de ejecución y el tiempo  que más se demoró esa línea, si así mismo como menciono, toda esa información. En este momento es posible que dirán  “WOW todo eso puede ser genial, como no lo había visto antes”, :D, pues conocer que sucede en el interior de una función plpgsql puede ser complejo, a no ser por los Raise Notice y algún que otro truco, pero puede resultar torpe pues necesitamos colocar ese código dentro la función para hacer “Profiler” y puede ensuciar el mismo.

PLPROFILER al rescate

Por suerte y para algunas ocasiones existe plprofiler, como dicen en openscg, puede ser que se haya olvidado, pero es “muyyyy” útil para el “Profiler”, pues comencemos con un demo de como usarla y al final veran porque digo que puede ser “muyyyy” útil. :D.

Lo primero es descargarlo e instalarlo:

Aquí se descarga, luego lo descomprimimos:

unzip openscg-plprofiler-2ffdc2434a39.zip

#Luego se compila y se instala:
cd openscg-plprofiler-2ffdc2434a39
#Ejecutamos make y sudo make install:
make

y obtenemos un error 😦 :

Makefile:14: ../../src/Makefile.global: No existe el archivo o el directorio
Makefile:15: /contrib/contrib-global.mk: No existe el archivo o el directorio
make: *** No hay ninguna regla para construir el objetivo «/contrib/contrib-global.mk». Alto.

Bueno hay algo que no entiendo como resolverlo, para ese tipo de compilación, pero por suerte hay otros formas de hacerlo :D, “a la antigua”.

#compilo el código
gcc -I /usr/include/postgresql/9.4/server -fpic -c plprofiler.c
gcc -I /usr/include/postgresql/9.4/server -shared -o plprofiler.so plprofiler.o

#lo copio para las libs de postgreSQL
sudo cp plprofiler.so /usr/lib/postgresql/9.4/lib/

#cambio los permisos
sudo chmod 644 /usr/lib/postgresql/9.4/lib/plprofiler.so
# copio los archivos de la extensión
sudo cp plprofiler.control plprofiler--1.0.sql /usr/share/postgresql/9.4/extension/

Listo, a utilizarla :D, así de fácil.

Utilizando plprofiler:

Lo primero es crear la extensión y después activarla para su uso(hay que activarla en cada sesión para su trabajo), es decir se crea la extensión una sola vez y se activa su uso en cada sesión :

create extension plprofiler ;
select pl_profiler_enable(True);

Pueden ver que existe una vista llamada pl_profiler, en ella se puede ver los campos que le mencionada al inicio:

pl_profiler.line_number,pl_profiler.line,pl_profiler.exec_count,pl_profiler.total_time,pl_profiler.longest_time

Creamos una función y vemos como se utiliza, utilizamos una de las funciones de ejemplo del libro PL/pgSQL y otros lenguajes Procedurales en PostgreSQL, por supuesto la bases de datos Dell Store 2.

 

-- Cambia el precio de un producto pasado por parámetro, duplicándolo el total de veces
-- pasado como segundo parámetro, retornar el precio final haciendo uso del WHILE

CREATE FUNCTION cambiar_precio(id integer, cant integer) RETURNS numeric AS
$$
DECLARE
contador integer := 0;
precio numeric;
BEGIN
WHILE contador < cant LOOP
UPDATE products SET price = price * 2 WHERE prod_id = id RETURNING price INTO precio;
contador := contador + 1;
END LOOP;
RETURN precio;
END;
$$ LANGUAGE plpgsql;

la ejecutamos:

SELECT cambiar_precio(131, 2)

Hacemos un select a la vista:

select * from pl_profiler

y obtenemos:

resultado

De lo cual podemos ver analizar por ejemplo, las veces que se ha ejecutado una línea, en este caso la linea 7 se ejecutó dos veces, y su tiempo total de ejecución las dos veces 414 ms y el la vez que más se demoró 290 ms, otro análisis pudiera ser que donde más se demora la función es dentro del ciclo, bueno el análisis puede ser tan diverso como podamos, todo va a depender del código y lo que estemos buscando, pero ayudaría a ver picos de demora de alguna línea específica o tal vez detectar que se esta ejecutando una parte más que otra.

Si se necesita resetear los datos de la vista podemos ejecutar la función pl_profiler_reset().

Como ven puede resultar como decía anteriormente “muyyyy” útil. Pues manos a la obra y a utilizar la extensión

Nos vemos en otra entrada 😉

 

 

8 comentarios en “Haciendo Profiler a una función plpgsql

  1. Gracias por el dato.

    Has probado con la 9.3? compilé y moví los archivos a las rutas correspondientes pero al crear la extensión falla:

    ERROR: could not open extension control file “/usr/pgsql-9.3/share/extension/plprofiler.control”: No such file or directory

    Me gusta

    • Hola si he probado con el 9.3, ese error que te da es que no lo esta instalando en ese directorio, el cual es requerido, prueba haciendo el make con
      make use pgxs=1y luego

      make install tambien con use pgxs=1

      y eso es probable que no tengas que usar la versión antigua

      saludos

      Me gusta

      • Es que yo mismo copié el .control en ese directorio. Lo compilé con gcc, el make no funcionó, parece que los archivos deben estar en cierta ruta para que consiga el Makefile.global, pero aún no he descubierto dónde. Tengo CentOS 7.1.

        Me gusta

  2. busca el archivo Makefile en el directorio de la extensión y editarlo, indicándole donde está tu pg_config

    puede que en centos este en
    /usr/pgsql-9.3/bin/pg_config
    asi que modifica tu Makefile con
    PG_CONFIG = /usr/pgsql-9.3/bin/pg_config

    y luego make y make install

    de todos modos revisa bien

    quedo atento
    saludos

    Me gusta

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión /  Cambiar )

Google photo

Estás comentando usando tu cuenta de Google. Cerrar sesión /  Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión /  Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión /  Cambiar )

Conectando a %s