Hola listeros

Tengo un pequeño problema con una funcion plpgsql. La funcion tiene 3 parametros de entrada, un integer y dos timestamp. El caso es que dentro de la query con la que devuelvo un refcursor hago un filtro entre los dos parametros timestamps. Ahora me he dado cuenta de que tarda bastante la consulta y he metido un indice por el campo tiemstamp por el que filtro. Hasta ahi todo bien. Cojo la query de la funcion, la ejecuto cambiando los parametros por valores timestamp y tarda, pero un tiempo razonable. Hago lo mismo dentro del procedimiento, poniendo valores timestamp fijos y tarda aproximadamente lo mismo. Pero en cuanto pongo en la funcion los parametros de tipo timestamp, el tiempo se dispara.
Alguien sabe que problema puedo tener??

Las dos versiones de la funcion (en realidad es mucho mas compleja la query, pero esta sirve de ilustracion) son:

Sin usar parametros...

CREATE OR REPLACE FUNCTION obtener_envios2(p_fecha_ini timestamp, p_fecha_fin timestamp)
 RETURNS refcursor AS
$BODY$declare
--
l_rc_generic         refcursor;
--
BEGIN
 OPEN l_rc_generic FOR
SELECT * FROM ENVIOS where fecha_alta between '2009-05-18'::timestamp AND '2009-06-18'::timestamp;
 --
 RETURN l_rc_generic;
 --
END;
$BODY$
 LANGUAGE 'plpgsql' VOLATILE;

usando parametros

CREATE OR REPLACE FUNCTION obtener_envios2(p_fecha_ini timestamp, p_fecha_fin timestamp)
 RETURNS refcursor AS
$BODY$declare
--
l_rc_generic         refcursor;
--
BEGIN
 OPEN l_rc_generic FOR
SELECT * FROM ENVIOS where fecha_alta between p_fecha_ini AND p_fecha_fin;
 --
 RETURN l_rc_generic;
 --
END;
$BODY$
 LANGUAGE 'plpgsql' VOLATILE;

siempre llamo a la funcion de la forma...

begin;
select obtener_envios2('2009-02-18'::timestamp,'2009-06-18'::timestamp);
fetch all in "<unnamed portal xxxx>";

y en el primer caso me tarda (incluyendo el mostrar resultados) unos 850 milisegundos y en el segundo tarda unos 1600 milisegundos, y en los dos casos obtenemos los mismos datos.

Os agradeceria la ayuda.

Saludos


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

Responder a