Muchas gracias por la ayuda, ahora la ejecucion de la funcion va muchisimo mejor.

Alvaro Herrera escribió:
gorka escribió:
Hola:

El problema es que esta función es llamada desde Java, siendo recogida en un resultset dentro del metodo java, y no se como se puede recoger desde java un setof xxxx. Además a estas alturas, con el producto ya en producción, no se yo si la gente de Java va a estar dispuesta a cambiar la forma de obtener los datos.

Ugh.

Bueno, quizás funcione de todas formas.  La idea es que en lugar de
hacer

OPEN foo CURSOR FOR ... WHERE fecha < param1 AND fecha > param2

hagas esto:

EXECUTE 'OPEN foo CURSOR FOR ... WHERE fecha < ' || param1 || ' AND fecha > ' 
|| param2'

La diferencia es que en el segundo caso, los valores son interpolados al
momento de crear el plan, en cambio en el primer caso se hace el plan y
después se entregan los valores de los parámetros.

De hecho puedes conseguir imitar esto directamente en SQL para que veas
que se estropea el plan, de la siguiente forma:

PREPARE foo(timestamp, timestamp) AS SELECT bla, bla ... WHERE fecha < $1 AND 
fecha > $2
EXPLAIN ANALYZE EXECUTE foo(fecha1, fecha);

Y compara el plan que obtienes ejecutando la consulta directamente con
los valores:

EXPLAIN ANALYZE SELECT bla, bla ... WHERE fecha < 'fecha1' AND fecha > 'fecha2'


--
TIP 5: ¿Has leído nuestro extenso FAQ?
        http://www.postgresql.org/docs/faqs.FAQ.html

Responder a