marcioe Posted August 28, 2015 Report Share Posted August 28, 2015 Ola amigos um cliente me ligou reclamando que esta demorando demais para se vender um produto, (no caso especifico é CIMENTO) pois se trata de uma loja de materiais de construção. Pois bem o sql que executo quando ele digita o código do produto é o abaixo. Quando o item tem poucas vendas tipo assim 50.000 vezes por exemplo é rapidão, mas o problema é quando tem mais de 1.000.000 de vezes vendido, ai demora quase um minuto na rede para ele fazer essa ( select sum() ) o sql que executo e parecido com esse aqui SELECT vda.CODVEN, SUM(vda.QTDVEN) AS TOTAL_VENDIDO, COUNT(*) AS Num_Pedido, comp.COD_PRODUTO, SUM(comp.QTDE_COMPRADA) AS TOTAL_COMPRADO, COUNT(*) AS Num_comprado, SUM(comp.QTDE_COMPRADA)-SUM(vda.QTDVEN) AS SALDO FROM vendas AS vda LEFT JOIN compras AS comp ON vda.CODVEN = comp.COD_PRODUTO where comp.COD_PRODUTO = 1 GROUP BY vda.CODVEN a imagem abaixo explica melhor, aqui fiz um geral, porem é em minha base de testes e fiz com todos os produtos Teria uma forma de ser mais rápido ou algo diferente os campos de código do produtos são Indexados Quote Link to comment Share on other sites More sharing options...
evandro Posted August 28, 2015 Report Share Posted August 28, 2015 Olá, Crie uma tabela temporária das vendas e outra das compras com os filtros que forem necessários. crie índice pelo código do produto em ambas. Finalmente faça o select com o join nas tabelas resultantes. Quote Link to comment Share on other sites More sharing options...
marcioe Posted August 28, 2015 Author Report Share Posted August 28, 2015 Amigão, Evandro G. de PaulaDesculpa a minha Ignorância, mas eu não entendi o que voce passou Pela Lógica seria assim Ler a tabela de vendas filtrando pelo código *copiar os dados para a Temporária Ler a tabela de compras filtrando pelo código *copiar os dados para a Temporária Seria isso. Quote Link to comment Share on other sites More sharing options...
evandro Posted August 28, 2015 Report Share Posted August 28, 2015 Olá, Seria algo assim: create temporary table temp1 SELECT vda.CODVEN, SUM(vda.QTDVEN) AS TOTAL_VENDIDO, COUNT(*) AS Num_Pedido FROM vendas AS vda where vda.COD_PRODUTO = 1 GROUP BY vda.CODVEN; create index temp1 on temp1 ( codven ) create temporary table temp2 comp.COD_PRODUTO, SUM(comp.QTDE_COMPRADA) AS TOTAL_COMPRADO, COUNT(*) AS Num_comprado from compras as comp where comp.COD_PRODUTO = 1 GROUP BY vda.CODVEN; create index temp2 on temp2 ( codven ) SELECT vda.CODVEN, vda.TOTAL_VENDIDO, vda.Num_Pedido, comp.COD_PRODUTO, comp.TOTAL_COMPRADO, comp.Num_comprado, comp.QTDE_COMPRADA-vda.QTDVEN AS SALDO FROM temp1 AS vda LEFT JOIN temp2 AS comp ON vda.CODVEN = comp.COD_PRODUTO Quote Link to comment Share on other sites More sharing options...
marcioe Posted September 24, 2015 Author Report Share Posted September 24, 2015 Amigos, da forma que o Evendro indicou melhorou muito, mas mesmo assim demora uns 10 Segundos para o produto. Quando ele tem muitas vendas Tipo o produto numero 1 que no caso é cimento. Mesmo assim já ajudou muito... Quote Link to comment Share on other sites More sharing options...
Eroni Posted September 24, 2015 Report Share Posted September 24, 2015 Bom dia, da maneira como o seu projeto está, acredito ser dificil gerenciar base de dados grande. Eu uso uma tabela de movimento e uma tabela de saldos, esta ultima tem o codigo do produto, a data e o saldo. Os campos data e codigo do produto são chave primaria e possuem indices. Desta forma, qualquer pesquisa é instantânea independente da quantidade de registros. Luiz Fernando 1 Quote Link to comment Share on other sites More sharing options...
evandro Posted September 24, 2015 Report Share Posted September 24, 2015 Olá, Verifique se tem índice do campo CODVEN, tabela VENDAS. Na criação das tabelas temporárias não precisa do GROUP BY. Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.