Jump to content
Fivewin Brasil

Ajuda com Select mysql


Luiz Fernando

Recommended Posts

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

Link to comment
Share on other sites

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

Link to comment
Share on other sites

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 maiordata
FROM pedido AS pe

WHERE 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.

Link to comment
Share on other sites

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

Link to comment
Share on other sites

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.

Link to comment
Share on other sites

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

Link to comment
Share on other sites

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 maiordata
FROM pedido AS pe

WHERE pe.data BETEWEEN data_inicial AND data_final
GROUP BY pe
.produto

Creio que desta forma fica mais rápido e mais logico, ou não :o

Espero ter ajudado.

Link to comment
Share on other sites

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

Link to comment
Share on other sites

Luiz uma tentativa:

SELECT res.produto,

res.maiordata

FROM

(SELECT pe.produto,

MAX(pe.data) AS maiordata
FROM pedido AS pe
GROUP BY pe
.produto ) res
WHERE 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,

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
×
×
  • Create New...