Luiz Fernando Posted November 18, 2015 Report Share Posted November 18, 2015 Colegas veja a situação abaixo tenho uma base de dados de 1.850.000 registros preciso dar um select e buscar a ultima data de movimento de cada produto fazendo assim, deixei rodando por quase duas horas e acabei cancelando SELECT pe.produto,max(pe.data) as maiordata FROM pedido AS pe GROUP BY pe.produto" HAVING maiordata < "+Any2Sql(cGet[1]) achei que era o HAVING tentei de novo da forma abaixo, após 30 minutos cancelei SELECT pe.produto,max(pe.data) as maiordata FROM pedido AS pe GROUP BY pe.produto alguém teria alguma dica Obrigado Ronaldbuch 1 Quote Link to comment Share on other sites More sharing options...
Luiz Fernando Posted November 18, 2015 Author Report Share Posted November 18, 2015 Colegas consegui resolver o problema estava no indice, apaguei todos indice desta tabela e criei eles novamente, depois disto foi rápido, agora uma outra pergunta , isto é normal ? preciso dar um tratamento de vez qdo nos indice, apagar e criar eles novo, 3 anos mexendo com mysql foi a primeira vez que aconteceu isto comigo. Obrigado Quote Link to comment Share on other sites More sharing options...
alex2002 Posted November 18, 2015 Report Share Posted November 18, 2015 Olá Luiz. Primeiro, seria legal você ter esta tabela indexada por data, isso iria acelerar o processo. Mas de qualquer forma tente: // SELECT pe.produto, max(pe.data) as maiordataFROM pedido AS peWHERE pe.data < "+Any2Sql(cGet[1])+" GROUP BY pe.produto // Se a tabela estiver indexada pela data vai ser um tiro. Senão, deve demorar um pouquinho, mas nada de 30 minutos. Quote Link to comment Share on other sites More sharing options...
alex2002 Posted November 18, 2015 Report Share Posted November 18, 2015 Olha, enquanto eu respondia vc solucionou. Mas, a questão dos índices não precisa de forma alguma ficar dando um "up", tenho cliente que tem mais de 08 anos utilizando e nada de ficar mexendo. Luiz Fernando 1 Quote Link to comment Share on other sites More sharing options...
Luiz Fernando Posted November 19, 2015 Author Report Share Posted November 19, 2015 Vlw Alexandre, como o problema só ocorreu na minha maquina, acredito que este problema pode ter sido causado pelos backup que faço do cliente para meu servidor, menos mau... Obrigado Quote Link to comment Share on other sites More sharing options...
Luiz Fernando Posted November 19, 2015 Author Report Share Posted November 19, 2015 Pessoal muito estranho ontem após apagar os indice, foi rapidinho, acima quando dize que criei eles de novo não fiz isto pois já era tarde, e iria levar um bom tempo para isto, como foi rapido sem os indice, achei que após criar eles seria mais rapido ainda,hoje criei eles do zero, dai o problema voltou a ocorrer, mais de horas no select abaixo sem exibir nada só processando. SELECT pe.produto,MAX(pe.data) AS maiordata FROM pedido AS pe GROUP BY pe.produto HAVING maiordata < '2014-01-01' resumindo sem indice vai de boa, com indice esquece. tenho varios indice nesta tabela, o primeiro é o campo DATA // pedido PSQL_Index('empresoft','pedido','peddata' ,{'data'},.t.) PSQL_Index('empresoft','pedido','pedpedido',{'pedido'},.t.) PSQL_Index('empresoft','pedido','clipedido',{'cliente'},.t.) PSQL_Index('empresoft','pedido','propedido',{'produto'},.t.) PSQL_Index('empresoft','pedido','tippedido',{'tipo'},.t.) PSQL_Index('empresoft','pedido','lotpedido',{'lote'},.t.) PSQL_Index('empresoft','pedido','carpedido',{'carga'},.t.) a função abaixo PSQL_Index é de nosso amigo que não esta mais entre a gente(Sergio Personal) PSQL_Index(xBanco,'tabela','idx_nome_indice',{'campo1','campo2'},Arg1) **-----------------------------------------------------------------------------** ** Finalidade: criar indices nativos no banco de dados ** Parametros: Conexao = Qual banco vai conectar ** Tabela = tabela que vai criar os indices ** Indice = Nome do indice que vai ser criado ** Campos = Campos no indice ** DeletaIndices = .t. (apaga) ou .f. (nao apaga) **-----------------------------------------------------------------------------** function PSQL_Index(Conexao,Tabela,Indice,Campos,DeletaIndices) **--[ verifica se vai deletar os indices existentes ]--** if(DeletaIndices) cSql="ALTER TABLE `"+Lower(tabela)+"` DROP INDEX `"+Lower(indice)+"`" //INTO (conexao) SqlExecute(cSql) //SQL EXECUTE ("ALTER TABLE `"+Lower(tabela)+"` DROP INDEX `"+Lower(indice)+"`") INTO (conexao) endif **--[ cria indices se nao existente ]--** if(At(indice,ToString(SQLArray("SHOW INDEX FROM "+tabela,,Conexao)))==0) cCampo:='' for x = 1 TO Len(Campos) if(Len(Campos)== X) cCampo+=Lower(Campos[X]) else cCampo+=Lower(Campos[X])+"," endif next cSql:="CREATE INDEX "+Lower(AllTrim(Indice))+" ON "+Lower(AllTrim(tabela))+" ("+AllTrim(cCampo)+")" SqlExecute(cSql) //PSQL_Execute(conexao,cCmd,Tabela) endif return(NIL) que coisa de louco sera que alguém tem alguma sugestão. Obrigado Quote Link to comment Share on other sites More sharing options...
alex2002 Posted November 20, 2015 Report Share Posted November 20, 2015 Então, Cara, o HAVING não tem o mesmo efeito que o WHERE. No seu caso não precisa usar HAVING, você pode usar o WHERE. Eu garanto que vai ficar mais rápido. O WHERE faz um filtro na hora que está executando o SELECT, e como vc vai ter indíce fica rápido. O HAVING não, ele varre todo o banco (quando não tem WHERE) e filtra o que vai mostrar. Quote Link to comment Share on other sites More sharing options...
Luiz Fernando Posted November 20, 2015 Author Report Share Posted November 20, 2015 Alexandre nos teste aqui a primeira coisa que tinha feito fo tirar o HAVING e dexar somente com o GROUP BY, demorou da mesma forma SELECT pe.produto,MAX(pe.data) FROM pedido AS pe GROUP BY pe.produto engraçado que sem o indice vai de boa. Obs: esta tabela tem 1.800.000 registro, acho que mesmo assim era para ir rapido Obrigado Quote Link to comment Share on other sites More sharing options...
miragerr Posted November 20, 2015 Report Share Posted November 20, 2015 Ola, boa noite Veja o que você esta fazendo, esta varrendo todo a tabela, não tem um WHERE, é isso mesmo, fazer toda a tabela, sem nenhum critério, pois você colocou o HARVING como critério, não seria melhor você colocar algo assim SELECT pe.produto,MAX(pe.data) AS maiordataFROM pedido AS pe WHERE pe.data BETEWEEN data_inicial AND data_finalGROUP BY pe.produto Creio que desta forma fica mais rápido e mais logico, ou não Espero ter ajudado. Quote Link to comment Share on other sites More sharing options...
Luiz Fernando Posted November 20, 2015 Author Report Share Posted November 20, 2015 Ola Jackson, preciso analisar todo movimento, e desativar os produtos sem movimento anterior a uma determinada data, usando WHERE < variavel_minha_data como o sugerido pelo Alexandre acima não da certo, pois preciso fazer isto em cima da maior data , pois uso o group by produto, desta forma a unica forma de dar certo seria mesmo o HAVING pelo menos em topicos anterior aqui foi o que me passaram. colega caso tiver uma sugestão Obrigado Quote Link to comment Share on other sites More sharing options...
miragerr Posted November 21, 2015 Report Share Posted November 21, 2015 Ola, boa madrugada Este tipo de consulta vai ser frequente, ou você esta fazendo isso somente uma vez. Fico no aguardo. Quote Link to comment Share on other sites More sharing options...
Geraldo (gbsilva) Posted November 21, 2015 Report Share Posted November 21, 2015 Luiz uma tentativa: SELECT res.produto, res.maiordata FROM (SELECT pe.produto, MAX(pe.data) AS maiordataFROM pedido AS peGROUP BY pe.produto ) resWHERE res.maiordata < '2014-01-01' ORDER BY res.produto, res.maiordata (se quiser ordenar, por exemplo) Sobre os índices acho que você tem muito índice para uma única tabela e por acaso você não esta criando/atualizando esses índices antes desse select não né, pois índice em mysql cria uma vez e pronto, nem deve mencioná-lo mais, pois o próprio mysql trata de atualizá-los. Pior não fica rsss...., então tenta como acima para ver o que acontece? Sds, 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.