Ver Mensaje Individual
  #9  
Antiguo 08-06-2004
Giniromero Giniromero is offline
Miembro
 
Registrado: may 2003
Ubicación: Madrid
Posts: 296
Reputación: 21
Giniromero Va por buen camino
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
  /* Procedure Text */
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
/*si el año de finalización de curso para el registro es igual que este año
es un registro de un alumno que no se ha matriculado aun*/
 If  ((extract(year from :VFECFINCURSO))=(extract(year from current_date))) Then Begin
  NUMALU= :VNUMALU;
  NOMBRE=  :vnombre;
  NOMCLI= :VNOMCLI;
  TELFALU=  :VTELFALU;
  ALIASNEW= :VALIASNEW;
    suspend;
 End /*fin del if*/
END /*fin del for*/
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
  /* Procedure Text */
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)

/* En este caso nos interesa también, ver los alumnos que se han matriculado
y pasan a adultos, procedente de un grupo de niños. Por eso incluimos el producto 40*/
 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 /*fin del for*/
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
  /* Procedure Text */
  FOR

    select distinct
    mainalu.NUMALU, (mainalu.nomalu  ||'  ' || mainalu.apelalu) as NOMBRE,
    mainalu.telfalu,
    matri.fecfin,
    grupos.alias,/*OLDALIAS*/
    (clientes.nomcl || '  ' || clientes.apelcl) as nomcli,
     P_GRUPO.alias /*NEWALIAS*/



     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 /* fin del if*/
  END /*fin del for*/
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
__________________
Sonrie al mundo, y el mundo te sonreirá :)
Responder Con Cita