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
|
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: