Decrease the time required function - Mailing list pgsql-general

From Karel Riverón
Subject Decrease the time required function
Date
Msg-id 5114FFF9.1090109@estudiantes.uci.cu
Whole thread Raw
Responses Re: Decrease the time required function  (Albe Laurenz <laurenz.albe@wien.gv.at>)
List pgsql-general
Hi everyone,<br /><br /> I have a PL/pgSQL function that it takes 4 seconds to execute. This is my function:<br /><br
/><fontcolor="#666666" face="Courier New, Courier, monospace">CREATE OR REPLACE FUNCTION
listarcasosrecuperados(escenario_idinteger)<br />   RETURNS SETOF caso_real AS<br /> $BODY$ <br /><br /> DECLARE <br
/><br/>     criterios CURSOR FOR SELECT * FROM criterio;<br /><br />     casos_reales CURSOR FOR SELECT * FROM
caso_real;<br/><br />     sum_impactos NUMERIC DEFAULT 0;<br /><br />     sum_impacto_modulo NUMERIC DEFAULT 0;<br
/><br/>     impacto NUMERIC DEFAULT 0;<br /><br />     valor_caso_real_criterio NUMERIC DEFAULT 0;<br /><br />    
valor_caso_escenario_criterioNUMERIC DEFAULT 0;<br /><br />     s NUMERIC DEFAULT 0.0;<br /><br />     c RECORD;<br
/><br/>     cr RECORD;<br /><br />     crc RECORD;<br /><br />     cec RECORD;<br /><br />    
casos_escenarios_criteriosRECORD;<br /><br />     casos_reales_criterios RECORD;<br /><br /> BEGIN<br /><br /> /*<br />
 *RECORRER CURSOR DE CRITERIOS Y <br />  * SUMATORIA DE LOS IMPACTOS DE LOS CRITERIOS<br />  */<br /> OPEN
criterios;<br/><br /> LOOP FETCH criterios into c;<br /><br /> IF NOT FOUND THEN<br />     EXIT;<br /> ELSE<br />    
sum_impactos:= sum_impactos + c.impacto;<br /> END IF;<br /><br /> END LOOP;<br /><br /> CLOSE criterios;<br /><br />
/*<br/>  * OBTENER CRITERIOS DEL CASO ESCENARIO PASADO POR PARAMETRO<br />  */<br /><br /> SELECT * INTO
casos_escenarios_criteriosFROM caso_escenario_criterio WHERE caso_escenario_id = $1;<br /><br /> /*<br />  * RECORRER
CURSORDE CASOS REALES * <br />  */<br /> BEGIN<br /> OPEN casos_reales;<br /><br /> LOOP FETCH casos_reales into cr;<br
/><br/> IF NOT FOUND THEN<br />     EXIT;<br /> ELSE<br />     sum_impacto_modulo := 0;<br /><br />     impacto :=
0;<br/><br />     valor_caso_real_criterio := 0;<br /><br />     valor_caso_escenario_criterio := 0;<br /><br />    
/*<br/>     * OBTENER CRITERIOS DEL CASO REAL EN CUESTIÓN    <br />     */<br /><br />     SELECT * INTO
casos_reales_criteriosFROM caso_real_criterio WHERE caso_real_id = cr.id;<br /><br />     OPEN criterios;<br /><br />
   LOOP FETCH criterios into c; <br /><br />     IF NOT FOUND THEN<br />         EXIT;    <br />     ELSE<br />     <br
/>        SELECT c_r_c.id, valor INTO crc <br />         FROM caso_real_criterio c_r_c, caso_real c_r,criterio c_ <br
/>        WHERE c_.id = c_r_c.criterio_id <br />         AND c_.id = c.id <br />         AND c_r_c.caso_real_id =
c_r.id<br />         AND c_r.id = cr.id;<br /><br />         valor_caso_real_criterio := crc.valor;<br /><br />        
SELECTc_e_c.id, valor INTO cec <br />         FROM caso_escenario_criterio c_e_c, caso_escenario c_e,criterio c_ <br />
       WHERE c_.id = c_e_c.criterio_id <br />         AND c_.id = c.id <br />         AND c_e_c.caso_escenario_id =
c_e.id<br />         AND c_e.id = escenario_id;<br /><br />         valor_caso_escenario_criterio := cec.valor;<br
/><br/>         impacto := c.impacto;<br /><br />         sum_impacto_modulo := sum_impacto_modulo + impacto * (1 -
abs(valor_caso_real_criterio- valor_caso_escenario_criterio)/5);<br />     <br />     END IF;<br /><br />     END
LOOP;<br/><br />     CLOSE criterios;<br /><br />     s := sum_impacto_modulo / sum_impactos;<br /><br />     IF s
>=0.75 THEN<br />            RETURN NEXT cr;         <br />         END IF;    <br />     <br /> END IF;<br />    
<br/> END LOOP;<br /><br /> CLOSE casos_reales;<br /><br /> END;<br /><br /> END <br /><br /> $BODY$<br />   LANGUAGE
plpgsqlVOLATILE<br />   COST 100<br />   ROWS 1000;<br /> ALTER FUNCTION listarcasosrecuperados(integer)<br />   OWNER
TOpostgres;</font><br /><font face="Times New Roman, Times, serif"><br /> I need to decrease the time required
function.Please, anyone helpme.<br />  <br /></font><div class="moz-signature"><div style="font: 16px Times New
Roman;color:black"><font face="Times New Roman, Times, serif"> Regards, Karel Riverón<br /> Students Scientific
Council<br/> Informatics Science University</font><br /><br /><br /></div></div> 

pgsql-general by date:

Previous
From: Albe Laurenz
Date:
Subject: Re: DEFERRABLE NOT NULL constraint
Next
From: Andreas Kretschmer
Date:
Subject: Bug, Feature, or what else?