Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Olá amigos, há algum tempo desenvolvi um relatório onde mostra um balancete das contas a pagar do meu cliente, o problema é que a cada dia que se passa tem aumentado mais o tempo do processamento da sql desse relatório, montei uma stored procedure e a chamo ao executar a sql, porem o relatório está demorando cerca de 4 horas para executar. Estou usando o firebird 2.1 e meu computador é um Dual Core com 4gb de ram. Quando é executado no servidor da empresa q é um Xeon demora certa de umas 3 horas.
Essa já é a segunda reestruturação que faço nesse relatório, antes não usava o stored procedure, fazia direto na sql, mas para ganhar performace fiz com stored procedure, porém agora já está novamente lento.
abaixo vou enviar o modelo da sql e stored procedure que estou executando, caso alguém tenha alguma dica de como turbinar isso me avise por favor.
a tabela de apagar tem cerca de 40 mil registros
a tabela de ligapgto tem cerca de 38 mil registros
a tabela de pagamento tem cerca de 21 mil registros
a tabela de fornecedor tem cerca de 3 mil registros.
##########SQL
SELECT AVCTO, ADATA, ACODFOR, FORRAZAO, ANUMDOC, AOBS, ASTATUS, ACODUNI, AVALOR
FROM SP_BALANCETE_APAGAR(:PDATA,:PUNIDADE)
WHERE AVALOR > 0
ORDER BY FORRAZAO, ACODFOR, AVCTO
##########STORED PROCEDURE
CREATE OR ALTER PROCEDURE SP_BALANCETE_APAGAR (
pdata date,
punidade integer)
returns (
avcto date,
adata date,
acodfor integer,
forrazao varchar(40),
anumdoc varchar(15),
aobs varchar(80),
astatus varchar(7),
acoduni integer,
avalor numeric(9,2))
as
BEGIN
FOR
SELECT A.AVCTO, A.ADATALCTO, A.ACODFOR, F.FORRAZAO, A.ANUMDOC, A.AOBS, A.ASTATUS, A.ACODUNI,
SUM(A.AVALOR - COALESCE((SELECT SUM(L.LVALPGTO)
FROM LIGAPGTO L LEFT OUTER JOIN PAGAMENTO P ON (L.LSEQPGTO = P.PSEQUENCIA)
WHERE (P.SISUNIDADE = :PUNIDADE) AND ( A.ASEQUENCIA = L.LSEQCONTA ) AND ( P.PDATA <= :PDATA )), 0)) AS AVALOR
FROM APAGAR A LEFT OUTER JOIN FORNECEDOR F ON ( A.ACODFOR = F.FORCODIGO )
WHERE ( A.ADATALCTO <= :PDATA ) AND A.ACODUNI = :PUNIDADE
GROUP BY A.AVCTO, A.ADATALCTO, A.ACODFOR, F.FORRAZAO, A.ANUMDOC, A.AOBS, A.ASTATUS, A.ACODUNI
INTO :AVCTO, :ADATA, :ACODFOR, :FORRAZAO, :ANUMDOC, :AOBS, :ASTATUS, :ACODUNI, :AVALOR
DO SUSPEND;
END
Carregando comentários...