From: | "Nicola Strappazzon" <nicola51980(at)gmail(dot)com> |
---|---|
To: | "Nicola Strappazzon" <nicola51980(at)gmail(dot)com>, pgsql-es-ayuda(at)postgresql(dot)org |
Subject: | Re: Dudas en un query con funcion y con el where. |
Date: | 2006-10-18 15:14:14 |
Message-ID: | f32f65ea0610180814p66bf1a87w4935f5e0b61d54d1@mail.gmail.com |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-es-ayuda |
Coye voy a probar, pero te mando lo que contiene la función, por q de verdad
creo q esta dificil ponerla en un subquery, Gracias por la ayuda!.
-- DROP FUNCTION fn_xrxx_estudiante_iap(int8, int4);
CREATE OR REPLACE FUNCTION fn_xrxx_estudiante_iap(int8, int4)
RETURNS float4 AS
$BODY$
DECLARE
iEscuela INT2;
iReturn FLOAT4;
fV1 FLOAT4;
fV2 FLOAT4;
BEGIN
IF (SELECT COUNT(*)
FROM tbl_Usuarios
WHERE PK_Usuario = $1) = 0 THEN
RETURN -1;
END IF;
iEscuela := (SELECT pk_atributo FROM fn_xrxx_estudiante_escuela($1) AS
(pk_atributo int8, codigo int2, escuela VARCHAR(45), fk_estructura int2,
nombre VARCHAR(45)));
fV1 := (SELECT SUM(A.UnidadCredito * RA.Calificacion )
FROM tbl_recordsacademicos RA
INNER JOIN tbl_Asignaturas A ON RA.FK_Asignatura =
A.PK_Asignatura
INNER JOIN tbl_inscripciones i ON i.pk_inscripcion =
ra.fk_inscripcion
INNER JOIN tbl_usuariosgrupos ug ON ug.pk_usuariogrupo =
i.fk_usuariogrupo
INNER JOIN tbl_pensums p ON p.pk_pensum = A.fk_pensum
WHERE ug.FK_Usuario = $1 AND
ra.FK_atributo = 862 AND
p.FK_Escuela = iEscuela AND
i.fk_periodo = $2);
fV2 := (SELECT SUM(A.UnidadCredito)
FROM tbl_recordsacademicos RA
INNER JOIN tbl_Asignaturas A ON
RA.FK_Asignatura = A.PK_Asignatura
INNER JOIN tbl_inscripciones i ON
i.pk_inscripcion = ra.fk_inscripcion
INNER JOIN tbl_usuariosgrupos ug ON
ug.pk_usuariogrupo = i.fk_usuariogrupo
INNER JOIN tbl_pensums p ON p.pk_pensum = A.fk_pensum
WHERE ug.FK_Usuario = $1 AND
ra.FK_atributo = 862 AND
p.FK_Escuela = iEscuela AND
i.fk_periodo = $2);
iReturn := fV1 / fV2;
RETURN iReturn;
END;
$BODY$
LANGUAGE 'plpgsql' VOLATILE;
ALTER FUNCTION fn_xrxx_estudiante_iap(int8, int4) OWNER TO postgres;
COMMENT ON FUNCTION fn_xrxx_estudiante_iap(int8, int4) IS 'Calcula el Indice
Academico de un Periodo (IAP) en especifico y de un estudiante
determinado.';
On 10/18/06, Alvaro Herrera <alvherre(at)commandprompt(dot)com> wrote:
>
> Nicola Strappazzon escribió:
> > Hola lista, se me presento un problema con el tiempo que se tarda para
> > retornas datos de una consulta, dicha consulta llama a una función para
> > calcular el indice academico de un estudiante, y luego llamo nuevamente
> ha
> > esta funcion para filtrar los datos que sean mayor o igual a 16.
> >
> > SELECT DISTINCT u."pk_usuario", u."nombre", u."apellido",
> > fn_xrxx_estudiante_iap(u."pk_usuario", 109)
> > FROM tbl_recordsacademicos ra
> > INNER JOIN tbl_inscripciones i ON i.pk_inscripcion = ra.fk_inscripcion
> > INNER JOIN tbl_asignaturas ag ON ag.pk_asignatura = ra.fk_asignatura
> > INNER JOIN tbl_usuariosgrupos ug ON ug.pk_usuariogrupo =
> i."fk_usuariogrupo"
> > INNER JOIN tbl_usuarios u ON u.pk_usuario = ug.fk_usuario
> > WHERE i.fk_periodo = 109
> > AND i.fk_atributo = 11
> > AND fn_xrxx_estudiante_iap(u."pk_usuario", 109) >= 16;
> >
> > Mi pregunta es la siguiente, como hago para no llamar dos veces a la
> función
> > y me filte los datos, existe esa posibilidad? hay otra forma?
>
> Puedes meter la funcion en un subselect en el FROM. No tengo tiempo en
> este momento de mostrarte como se hace, algun otro listero te puede
> ayudar (si es que no puedes hacerlo tu mismo -- en realidad no es tan
> dificil)
>
> Una vez que lo hayas hecho, examina el plan de ejecucion con EXPLAIN,
> porque puede que el optimizer reduzca esa consulta a esta misma forma.
> En ese caso deberas poner un OFFSET 0 a la consulta del subselect, lo
> cual actua como una barrera de optimizacion ("optimization barrier";
> puedes mirar los archivos de pgsql-hackers para leer mas sobre ese
> truco).
>
> --
> Alvaro Herrera
> http://www.CommandPrompt.com/
> PostgreSQL Replication, Consulting, Custom Development, 24x7 support
>
--
Nicola Strappazzon C.
---------------------------------
Cel.: 0416-632.67.28
From | Date | Subject | |
---|---|---|---|
Next Message | Pedro Mateo | 2006-10-18 15:17:05 | Re: RE: Ayuda extensiónes |
Previous Message | Alvaro Herrera | 2006-10-18 15:12:16 | Re: pregunta sobre psql |