Re: [pgsql-es-ayuda] [pgsql-es-ayuda] Función con select se ejecutar muy lenta comparada con la ejecución de select fuera de la función

From: "José Alberto Sánchez Nieto (Trabajo)" <albertosanchez(at)hiperusera(dot)es>
To: Alvaro Herrera <alvherre(at)2ndquadrant(dot)com>
Cc: Ernesto Lozano <elozanohia(at)gmail(dot)com>, pgsql-es-ayuda(at)postgresql(dot)org, Gerardo Herzig <gherzig(at)fmed(dot)uba(dot)ar>, Hellmuth Vargas <hivs77(at)gmail(dot)com>, Anthony Sotolongo <asotolongo(at)gmail(dot)com>, folarte(at)peoplecall(dot)com
Subject: Re: [pgsql-es-ayuda] [pgsql-es-ayuda] Función con select se ejecutar muy lenta comparada con la ejecución de select fuera de la función
Date: 2016-12-22 10:39:35
Message-ID: F105DF64-C372-4D16-8490-1F4DA7ECEBFC@hiperusera.es
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

Disculpad la tardanza en contestar pero estamos en distinto uso horario, detallo un poco mejor la situación, por simplicidad en la función que os he mandado sólo hay un select pero en la función real hay unos diez, todos son igual de simples que el que escribí, se selecciona un registro de una tabla con un where por un campo (varchar) que a su vez tiene creado un indice, simple, simple, y devuelvo en la función las 10 primary key que me devuelve cada select. Esta función es llamada desde un programa en java, el caso es que se ejecuta entre 400.000 y 800.000 veces y claro, aunque las diferencias tal y cómo se han mostrado son pocas, al producirse en tantas ejecuciones sí que son muy significativas. He probado varias cosas que habéis comentado:
- Poner dentro de la función la select sin parámetros poniendo el valor directamente y me tarda más ó menos igual (0.230)
- ¿El auto_explain vale para ver los planes de todas las select que están dentro de la función?, es que no he logrado ver la diferencia con hacer el explain en cada select individualmente
- Lo que sí me ha funcionado es la sugerencia de Alvaro, desde la shell poner el PREPARE y luego utilizar el EXPLAIN ANALIZE EXECUTE, con esto sí que los tiempos son exactamente iguales que lanzar la consulta desde la shell (0.045)
Lo que no sé muy bien es cómo replicar este comportamiento dentro de la función, ¿puedo hacer el PREPARE dentro de la función?, ¿tendría que hacerlo por cada una de las 10 select que contiene la función y tras él el execute?, ¿tendría que descargar los prepare tras utilizar el execute ya que la función se va a repetir 400.000 veces en la misma sesión?, la verdad es que no he encontrado ejemplos de cómo hacer todo esto desde dentro de la función. Tampoco sé si es la única opción ó si se os ocurre alguna otra forma menos laboriosa de hacerlo.
Gracias a todos y saludos.


José Alberto Sánchez Nieto
Director Dpto. Tecnologías de la Información
Hiper Usera, S.L.
Pol. Industrial Las Avenidas · Torrejón de la Calzada C.P. 28991 (Madrid)
Tlf: 918609900 · Fax: 918160000
albertosanchez(at)hiperusera(dot)es <mailto:albertosanchez(at)hiperusera(dot)es>
No me imprimas si no es necesario. Protejamos el medio ambiente

Le informamos que su dirección de correo electrónico, asi como el resto de los datos de carácter personal aportados, serán objeto de tratamiento automatizado en nuestro ficheros, con la finalidad de gestionar la agenda de contactos de nuestra empresa y, para poder atender a sus peticiones de consulta via electronica. Vd.podrá en cualquier momento ejercer el derecho de acceso, rectificación, cancelación y oposición en los términos establecidos en la Ley Orgánica 15/1999 mediante notificación escrita con copia de DNI., a la entidad, a través de éste e-mail.

La información incluida en este e-mail es CONFIDENCIAL, siendo para su usu exlusivo del destinatario arriba mencionado. Si Usted lee este mensaje y no es el destinatario indicado, le informamos de que está totalmente prohibida la utilización, divulgación, distribución y/o reproducción de esta comunicaci´ón sin autorización expresa en virtud de la legislacion vigente. Si ha recibido este mensaje por error le rogamos nos o notifique inmediatamente por esta misma vía y proceda a su eliminación.

> El 21 dic 2016, a las 19:59, Alvaro Herrera <alvherre(at)2ndquadrant(dot)com> escribió:
>
> "José Alberto Sánchez Nieto (Trabajo)" escribió:
>> Hola Ernesto, la versión que utilizo es la 9.6.1 y lo que utilizo es lo siguiente:
>> - Desde shell:
>> select * from d_articulo where id_articulo = ‘2097’
>
> Esto no compara exactamente lo mismo, porque en plpgsql se usan planes
> preparados para las consultas SQL. Prueba esto:
>
> PREPARE articulos AS SELECT * FROM d_articulo WHERE id_articulo = $1;
> EXPLAIN ANALYZE EXECUTE articulos('2097');
>
> Debería ser lento como la función. Si lo es, muestra el EXPLAIN ANALYZE
> a ver qué dice.
>
> --
> Álvaro Herrera https://www.2ndQuadrant.com/
> PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

In response to

Responses

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Anthony Sotolongo 2016-12-22 12:43:54 Re: [pgsql-es-ayuda] Función con select se ejecutar muy lenta comparada con la ejecución de select fuera de la función
Previous Message Hellmuth Vargas 2016-12-21 19:00:05 Re: [pgsql-es-ayuda] Re: [pgsql-es-ayuda] Re: [pgsql-es-ayuda] Función con select se ejecutar muy lenta comparada con la ejecución de select fuera de la función