Array
(
)

Procedure lenta

CARLOS ALBERTO PHELIPPE
|
MVP
    22 nov 2010


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.

LEONARDO XAVIER
   - 23 nov 2010

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?

CARLOS ALBERTO PHELIPPE
|
MVP
    23 nov 2010

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?

LEONARDO XAVIER
   - 23 nov 2010



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