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:
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
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
Curtir tópico
+ 0
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
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
Clique aqui para fazer login e interagir na Comunidade :)