Procedure lenta
22/11/2010
0
a procedure abaixo esta demorando, em média, 5 segundos para ser executada:
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.
Carlos Phelippe
Posts
23/11/2010
Leonardo Xavier
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?
23/11/2010
Carlos Phelippe
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?
23/11/2010
Leonardo Xavier
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
Clique aqui para fazer login e interagir na Comunidade :)