DevMedia

Procedure lenta

0
Olá pessoal,
a procedure abaixo esta demorando, em média, 5 segundos para ser executada:

#Código
SET TERM !!;
CREATE OR ALTER PROCEDURE RETORNA_ANIVERSARIANTES(INICIO INTEGER, FIM INTEGER, DATA_ZERO DATE, LOGIN_IN VARCHAR(30))
RETURNS (NOME VARCHAR(100), IDENTIFICADOR INTEGER, NOME2 VARCHAR(100), DATA DATE, TIPO_PESSOA INTEGER, IDENTIFICADOR_PC INTEGER,
        
 ID_DEPENDENTE VARCHAR(32), FONE1 VARCHAR(15), FONE2 VARCHAR(15), FONE3 
VARCHAR(15), FONE4 VARCHAR(100), DIA INTEGER, MES INTEGER)
AS
BEGIN

    FOR SELECT PF.IDENTIFICADOR, D.NOME, DATA, FONE_RESIDENCIAL, FONE_CELULAR, FONE_COMERCIAL, D.EMAIL, PF.NOME, D.IDENTIFICADOR
    FROM PESSOAFISICA PF INNER JOIN DEPENDENTE D ON D.ID_PESSOA = PF.IDENTIFICADOR
   
 WHERE (EXTRACT(MONTH FROM DATA_NASCIMENTO)*100)+EXTRACT(DAY FROM 
DATA_NASCIMENTO) between :INICIO and :FIM and DATA_NASCIMENTO <> 
:DATA_ZERO
    AND ((PF.LOGIN = :LOGIN_IN) OR (PUBLICA=1)) order by data
    INTO :IDENTIFICADOR, :NOME, :DATA, :FONE1, :FONE2, :FONE3, :FONE4, :NOME2, :ID_DEPENDENTE
    DO
    BEGIN
      IDENTIFICADOR_PC = -1;
      DIA = EXTRACT(DAY FROM DATA);
      MES = EXTRACT(MONTH FROM DATA);
      TIPO_PESSOA = 3;
      SUSPEND;
    END

    FOR SELECT IDENTIFICADOR, NOME, DATA_NASCIMENTO, FONE_RESIDENCIAL, FONE_CELULAR, FONE_COMERCIAL, EMAIL, APELIDO
    FROM PESSOAFISICA
   
 WHERE (EXTRACT(MONTH FROM DATA_NASCIMENTO)*100)+EXTRACT(DAY FROM 
DATA_NASCIMENTO) between :INICIO and :FIM and DATA_NASCIMENTO <> 
:DATA_ZERO
    AND ((LOGIN = :LOGIN_IN) OR (PUBLICA=1)) order by data_nascimento
    INTO :IDENTIFICADOR, :NOME, :DATA, :FONE1, :FONE2, :FONE3, :FONE4, :NOME2
    DO
    BEGIN
      DIA = EXTRACT(DAY FROM DATA);
      MES = EXTRACT(MONTH FROM DATA);
      TIPO_PESSOA = 0;
      IDENTIFICADOR_PC = -1;
      SUSPEND;
    END

    FOR SELECT IDENTIFICADOR, NOME, DATA, FONE, FONE_FAX, FONE_CEL, EMAIL, RS
    FROM PESSOAJURIDICA
    WHERE (EXTRACT(MONTH FROM DATA)*100)+EXTRACT(DAY FROM DATA) between :INICIO and :FIM and DATA <> :DATA_ZERO
    AND ((LOGIN = :LOGIN_IN) OR (PUBLICA=1)) order by data
    INTO :IDENTIFICADOR, :NOME, :DATA, :FONE1, :FONE2, :FONE3, :FONE4, :NOME2
    DO
    BEGIN
      DIA = EXTRACT(DAY FROM DATA);
      MES = EXTRACT(MONTH FROM DATA);
      TIPO_PESSOA = 1;
      IDENTIFICADOR_PC = -1;
      SUSPEND;
    END

    FOR SELECT PJ.IDENTIFICADOR, CPJ.NOME, CPJ.DATA, CPJ.FONE, CPJ.CELULAR, PJ.FONE, CPJ.EMAIL, PJ.NOME, CPJ.IDENTIFICADOR
    FROM PESSOAJURIDICA PJ INNER JOIN CONTATO_PJ CPJ ON CPJ.IDENTIFICADOR_PJ = PJ.IDENTIFICADOR
   
 WHERE (EXTRACT(MONTH FROM CPJ.DATA)*100)+EXTRACT(DAY FROM CPJ.DATA) 
between :INICIO and :FIM and CPJ.DATA <> :DATA_ZERO
    AND ((LOGIN = :LOGIN_IN) OR (PUBLICA=1)) order by data
    INTO :IDENTIFICADOR, :NOME, :DATA, :FONE1, :FONE2, :FONE3, :FONE4, :NOME2, :IDENTIFICADOR_PC
    DO
    BEGIN
      DIA = EXTRACT(DAY FROM DATA);
      MES = EXTRACT(MONTH FROM DATA);
      TIPO_PESSOA = 2;
      SUSPEND;
    END


END!!

SET TERM ; !!




Como poderia melhorar essa performance?

A tabelas tem aproximadamente 51 mil registros.

Respostas (3)

0
Ola bom dia.

         Você basicamente esta fazendo uma consulta individual em cada tabela e após esta consulta esta juntando os dados em um relatório. Você ja tentou fazer a uniao das tabelas Pessoa Física e juridica? E após isso filtrar os dados?

0
Amigos,
a tabela pessoafisica tem aproximadamente 70mil registros.. e esta demorando 3 segundos para fazer a consulta. É muito tempo?

Para eu usar o UNION todos os campo retornados tem que ter os mesmos tipos no select correto?
0

Citação:
Amigos,
a tabela pessoafisica tem aproximadamente 70mil registros.. e esta demorando 3 segundos para fazer a consulta. É muito tempo?

Para eu usar o UNION todos os campo retornados tem que ter os mesmos tipos no select correto?


Tem sim