Hola a todos,
He estado probando lo que me comentó guillotmarc. El caso es que parece que funcina cuando lo utilizo en un procedimiento que tira de otro procedimiento y de unas tablas, pero me va muy, muy lento.
He estado revisando los indices para las tablas que intervienen en cada uno de ellos, parece que tengo todos los campos que se usan en algún momento en el where dentro de un indice directamente en su tabla correspondiente. Pero me sigue llendo lento, muy, muy lento.
Arta de no conseguir nada, decidí que tal vez, el hecho de que esté tirando de otro procedimiento, podía ser la causa de la tardanza, (aunque este procedimiento no tarda en ejecutarse), así que decidí montar el procedimiento con todo el código directamente dentro de este procedimiento, para que no dependa de ningún otro.
En el otro procedimiento utilizo inner join para ir juntando las tablas, y al juntar el código de los procedures, (el nuevo y del que dependía antes), encuentro que no me filtra bien, aunque eso si, va mucho más rápido.
El código que me funciona, aunque lento es:
Código SQL
[-]
CREATE PROCEDURE RESERVASPTES1
RETURNS (
NUMALU SMALLINT,
NOMBRE VARCHAR(95),
TELFALU VARCHAR(30),
NOMCLI VARCHAR(95),
ALIASNEW VARCHAR(25))
AS
DECLARE VARIABLE VNUMALU SMALLINT;
DECLARE VARIABLE VNOMBRE VARCHAR(95);
DECLARE VARIABLE VTELFALU VARCHAR(30);
DECLARE VARIABLE VNOMCLI VARCHAR(95);
DECLARE VARIABLE VFECFINCURSO TIMESTAMP;
DECLARE VARIABLE VALIASNEW VARCHAR(25);
begin
FOR
select distinct
renopla2.NUMALU, renopla2.nombre, renopla2.TELFALU, renopla2.nomcli,
renopla2.fecfincurso, grupos.alias
from renopla2 EXTE, grupos , comen
where (( select count (*) from renopla2 inte
Where inte.numalu=exte.numalu)=1 )
and ((renopla2.numalu=comen.numalu) and (comen.tipo=97) and (comen.alias=grupos.alias))
ORDER BY renopla2.NUMALU, renopla2.fecfincurso desc
into
:VNUMALU, :vnombre, :VTELFALU, :VNOMCLI, :VFECFINCURSO, :VALIASNEW
DO BEGIN
If ((extract(year from :VFECFINCURSO))=(extract(year from current_date))) Then Begin
NUMALU= :VNUMALU;
NOMBRE= :vnombre;
NOMCLI= :VNOMCLI;
TELFALU= :VTELFALU;
ALIASNEW= :VALIASNEW;
suspend;
End
END
end
Donde el código del procedimiento renopla2 es el siguiente:
Código SQL
[-]
CREATE PROCEDURE RENOPLA2
RETURNS (
NUMALU SMALLINT,
NOMBRE VARCHAR(95),
FNACI TIMESTAMP,
TELFALU VARCHAR(30),
CALLE VARCHAR(48),
CPALU VARCHAR(5),
POBLALU VARCHAR(35),
SEXALU VARCHAR(1),
NOMCLI VARCHAR(95),
SEXCL VARCHAR(1),
ALIAS VARCHAR(25),
FECFINCURSO TIMESTAMP)
AS
DECLARE VARIABLE VNUMALU SMALLINT;
DECLARE VARIABLE VNOMBRE VARCHAR(95);
DECLARE VARIABLE VFNACI TIMESTAMP;
DECLARE VARIABLE VTELFALU VARCHAR(30);
DECLARE VARIABLE VCALLE VARCHAR(48);
DECLARE VARIABLE VCPALU VARCHAR(5);
DECLARE VARIABLE VPOBLALU VARCHAR(35);
DECLARE VARIABLE VSEXALU VARCHAR(1);
DECLARE VARIABLE VNOMCLI VARCHAR(95);
DECLARE VARIABLE VSEXCL VARCHAR(1);
DECLARE VARIABLE VALIAS VARCHAR(25);
DECLARE VARIABLE VFECFINCURSO TIMESTAMP;
begin
FOR
select distinct alumnos.NUMALU, (alumnos.NOMALU || ' ' || alumnos.APELALU) AS APENOM,
alumnos.FNACALU, alumnos.TELFALU, (alumnos.viaalu || ' ' || alumnos.domialu) as CALLE,
alumnos.codpalu, alumnos.pobalu, alumnos.sexalu,
matri.fecfin,
grupos.alias,
(clientes.nomcl || ' ' || clientes.apelcl) as nomcli, clientes.sexcl
FROM (((alumnos INNER JOIN matri ON alumnos.numalu=matri.NUMALU)
inner JOIN grupos ON matri.numgrup=grupos.numgrup)
inner join clientes on alumnos.nic=clientes.nic)
WHERE ((matri.caubaja=1) AND (grupos.PRODUCTO>'21' AND grupos.producto<='34'))
ORDER BY alumnos.numalu, matri.fecfin desc
into
:VNUMALU, :vnombre, :vfnaci,:VTELFALU, :VCALLE, :VCPALU,
:VPOBLALU, :VSEXALU, :VFECFINCURSO, :valias, :VNOMCLI, :VSEXCL
DO BEGIN
NUMALU= :VNUMALU;
NOMBRE= :vnombre;
FNACI= :vfnaci;
TELFALU= :VTELFALU;
CALLE= :VCALLE;
CPALU= :VCPALU;
POBLALU= :VPOBLALU;
SEXALU= :VSEXALU;
FECFINCURSO= :VFECFINCURSO;
NOMCLI= :VNOMCLI;
SEXCL= :VSEXCL;
alias= :valias;
suspend;
END
end
El nuevo que estoy montando es:
Código SQL
[-]
CREATE PROCEDURE RESERVASPTES
RETURNS (
NUMALU SMALLINT,
NOMBRE VARCHAR(95),
TELFALU VARCHAR(30),
NOMCLI VARCHAR(95),
ALIASOLD VARCHAR(25),
ALIASNEW VARCHAR(25))
AS
DECLARE VARIABLE VNUMALU SMALLINT;
DECLARE VARIABLE VNOMBRE VARCHAR(95);
DECLARE VARIABLE VALIASOLD VARCHAR(25);
DECLARE VARIABLE VALIASNEW VARCHAR(25);
DECLARE VARIABLE VTELFALU VARCHAR(30);
DECLARE VARIABLE VNOMCLI VARCHAR(95);
DECLARE VARIABLE VFECFINCURSO TIMESTAMP;
BEGIN
FOR
select distinct
mainalu.NUMALU, (mainalu.nomalu ||' ' || mainalu.apelalu) as NOMBRE,
mainalu.telfalu,
matri.fecfin,
grupos.alias,
(clientes.nomcl || ' ' || clientes.apelcl) as nomcli,
P_GRUPO.alias
FROM alumnos mainalu
INNER JOIN matri ON (mainalu.numalu=matri.NUMALU)
inner JOIN grupos ON (matri.numgrup=grupos.numgrup)
inner join clientes on (mainalu.nic=clientes.nic)
inner join comen on (mainalu.numalu=comen.numalu), p_grupo
WHERE ((matri.caubaja=1) AND (grupos.PRODUCTO>'21' AND grupos.producto<'34'))
AND (comen.tipo=97) and (comen.alias=p_grupo.alias)
AND ((select COUNT (*) FROM alumnos inter
WHERE inter.numalu = mainalu.numalu)=1)
ORDER BY mainalu.NUMALU, matri.fecfin desc
into
:VNUMALU, :vnombre, :VTELFALU, :vfecfincurso, :valiasold, :vnomcli, :valiasnew
DO BEGIN
If ((extract(year from :VFECFINCURSO))=(extract(year from current_date))) Then Begin
NUMALU= :VNUMALU;
NOMBRE= :vnombre;
NOMCLI= :VNOMCLI;
TELFALU= :VTELFALU;
ALIASNEW= :VALIASnew;
ALIASold= :VALIASold;
suspend;
End
END
end
El cual, supuestamente tendría que ser la unión de los otros dos.
No me filtra por el select count, ¿que estoy haciendo mal?
¿hay forma de forzar indices a un procedimiento?
alguien me puede ayudar??
Muchas gracias
Virginia