PAGUE 6 MESES
LEVE 12 MESES
GARANTIR DESCONTO

Fórum Preciso otimizar esta consulta. #51427

28/06/2005

0

Olá

Fiz uma consulta meio complicada. O problema é que está muito demorado para processar. Leva uns 15 min para processar apenas um mês. Tem como melhorar? Agradeço se derem uma olhada e postar alguma dica para melhorar a velocidade. É muito importante. :(

Uso 3 tabelas (NFiscal, itens da NFiscal e Produtos), tenho que somar o total vendido de cada produto, dentro de um período, mas separado por mes. Seria assim: NFiscal emitidas de ´01/01/05´ a ´31/03/05´.

PRODUTO......01/05........02/05..........03/05........[b:e96070af15]TOTAL GERAL [/b:e96070af15]
PREGO......2.105,00....1.095,00.....1.015,00.........[b:e96070af15]4.215,00 [/b:e96070af15]
LIXA.........3.085,00....2.015,00......4.550,00.........[b:e96070af15]9.650,00 [/b:e96070af15]
COLA........2.150,00....1.350,00.....3.500,00..........[b:e96070af15]7.000,00 [/b:e96070af15]
Estou fazendo conforme a dica do amigo fsflorencio.
Este script serve para o mês de janeiro a dezembro, sendo que omiti os meses de fevereiro a novembro. O script deve ser gerado para cada período:

[color=green:e96070af15]Select C.codpro, C.Grupro, C.subpro, C.csepro, (select SUM(A.QTDNSI) from ESANSI A inner join ESANST B on B.NPCNST= A.NPCNSI where EXTRACT( YEAR FROM B.DATNST) = 2005 AND EXTRACT( MONTH FROM B.DATNST )=1 AND A.codnsi=C.codpro AND B.TIPO=´VND´ AND B.dcanst is NULL AND B.FATNST=´F´) qtdade_1_05, (select sum(A.totnsi-(A.totnsi*B.PDENST/100)-((A.totnsi-(A.totnsi*B.PDENST/100))*B.PODNST/100)) from ESANSI A inner join esanst B on B.NPCNST= A.NPCNSI where EXTRACT( YEAR FROM B.DATNST) = 2005 AND EXTRACT( MONTH FROM B.DATNST )=1 AND A.codnsi=C.codpro AND B.TIPO=´VND´ AND B.dcanst is NULL AND B.FATNST=´F´) total_1_05, ...... (select SUM(A.QTDNSI) from ESANSI A inner join ESANST B on B.NPCNST= A.NPCNSI where EXTRACT( YEAR FROM B.DATNST) = 2005 AND EXTRACT( MONTH FROM B.DATNST )=3 AND A.codnsi=C.codpro AND B.TIPO=´VND´ AND B.dcanst is NULL AND B.FATNST=´F´) qtdade_3_05, (select sum(A.totnsi-(A.totnsi*B.PDENST/100)-((A.totnsi-(A.totnsi*B.PDENST/100))*B.PODNST/100)) from ESANSI A inner join esanst B on B.NPCNST= A.NPCNSI where EXTRACT( YEAR FROM B.DATNST) = 2005 AND EXTRACT( MONTH FROM B.DATNST )=3 AND A.codnsi=C.codpro AND B.TIPO=´VND´ AND B.dcanst is NULL AND B.FATNST=´F´) total_3_05 from esapro C Where (C.Grupro*10000) + (C.subpro*100) + C.csepro between 10105 and 20501[/color:e96070af15]


Uso firebird 1.5 e IBX.
tabelas:
ESAPRO - Produtos;
ESANST - Pedidos;
ESANSI - Itens dos pedidos;
Os campos são:
C.qtdpro - Qtdade do produto;
C.codpro - Codigo do produto;
C.grupro - Grupo do produto;
A.QTDNSI - Qtdade do item no pedido;
A.CODNSI - Codigo produto no item do pedido;
A.NPCNSI - Codigo do pedido na tabela item do pedido;
B.NPCNST - Codigo do pedido;
B.NNFNST - Numero da NF (depois de faturar)
B.datnst - Data do pedido;

Criei os seguintes índices:
[b:e96070af15]ESANST[/b:e96070af15]
[b:e96070af15]Primary Keys[/b:e96070af15]
ALTER TABLE ESANST ADD CONSTRAINT PK_NFSAIDA PRIMARY KEY (NPCNST);
[b:e96070af15]Indices[/b:e96070af15]
CREATE INDEX CLIENTE ON ESANST (CLINST);
CREATE INDEX DATA ON ESANST (DATNST);
CREATE INDEX ESANST_IDX1 ON ESANST (TIPO);
CREATE INDEX ESANST_IDX4 ON ESANST (DCANST);
CREATE INDEX FATURA ON ESANST (FATNST);

[b:e96070af15]ESANSI[/b:e96070af15]
[b:e96070af15]Unique Constraints[/b:e96070af15]
ALTER TABLE ESANSI ADD CONSTRAINT UNQ_ESANSI UNIQUE (NPCNSI, CODNSI);
[b:e96070af15]Foreign Keys[/b:e96070af15]
ALTER TABLE ESANSI ADD CONSTRAINT FK_ESANSI FOREIGN KEY (NPCNSI) REFERENCES ESANST (NPCNST) ON DELETE CASCADE ON UPDATE CASCADE;
[b:e96070af15]Indices[/b:e96070af15]
CREATE INDEX ESANSI_IDX1 ON ESANSI (TOTNSI);
CREATE INDEX ESANSI_IDX2 ON ESANSI (QTDNSI);
CREATE INDEX ITEM_NFSAIDA ON ESANSI (CODNSI);

[b:e96070af15]ESAPRO[/b:e96070af15]
[b:e96070af15]Primary Keys[/b:e96070af15]
ALTER TABLE ESAPRO ADD CONSTRAINT PK_PROD PRIMARY KEY (CODPRO);
[b:e96070af15]Indices [/b:e96070af15]
CREATE INDEX ESAPRO_IDX1 ON ESAPRO (GRUPRO);
CREATE INDEX ESAPRO_IDX2 ON ESAPRO (SUBPRO);
CREATE INDEX ESAPRO_IDX3 ON ESAPRO (CSEPRO);

[]´s


Ivonei

Ivonei

Responder

Posts

05/07/2005

Ivonei

Já Resolvi. :roll:

Tinha indice demais. Retirei os indices de campos varchar (B.Tipo, B.Fatnst) e mais alguns indices que achei que poderiam estar atrasando mais a consulta do que otimizando e funcionou. 8)
De 10min de espera para gerar a consulta, ficou em 10segundos. :shock:

[ ]´s


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar