Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Pessoal, estou com um probleminha.
Tenho uma base com 586000 linhas, e todo dia aumentam de 8000 a 15000 registros, esta base vem formatada do excel, eu uso um LOAD DATA INFILE para armazenar, convertendo os valores para os tipos padrões, varchar, int, bigint e datetime, mas preciso dar um JOIN com outra tabela usando campos bigint, com outras duas tabelas usando campos varchar.
Até que eu consegui um resultado, mas demora 40 segundos no servidor, estou em cima do prazo, tenho que entregar amanhã, 12/07/2014 18:00, não sei como melhorar o desempenho desta consulta, criei índices mas não foi suficiente, como eu poderia proceder? Não consigo pensar em mais nada.
Fez o Plano de Execução da query ?
A estatística do bd está atualizada ? Talvez seja o caso da atualização diária.
Desculpe @Fabiano Abreu, não ficou bem claro, a inserção é tranquila mesmo com o tratamento dos campos, inclusive, é rápida, o que estou tendo dificuldade são nos JOINs.
SELECT
c.empresa,
e.area_supervisor,
e.area_encarregado,
e.supervisor,
e.encarregado,
COUNT( distinct c.id_servico ) qtd_servico,
COUNT( distinct bd.id_reparo ) qtd_reparo
FROM servicos_encerrados c
left JOIN filial f ON f.descricao = c.empresa # varchar
left join estacao e ON e.id_filial = f.id # int
AND ( e.estacao = substr(c.setor,1,3) OR e.estacao= substr(c.setor,1,4) ) # varchar
left JOIN reparos bd ON bd.cliente = c.cliente # id
and date(bd.dt_abertura) between c.dt_referencia and DATE_ADD(c.dt_referencia, interval 30 day) # datetime
WHERE
c.estado = 'concluido' # varchar
and c.atividade = 'instalacao' # varchar
and c.dt_referencia BETWEEN '2014-06-01' AND '2014-06-30'
GROUP BY c.empresa # varchar
Tabela servicos_encerrados possui hoje 597456 linhas, nenhum índice a ser utilizado, os filtros estão no WHERE.
Tabela filial possui 7 linhas, nenhum índice e nenhum filtro (pois tenho que exibir o resultado por filial).
Tabela estacao possui 435 linhas usando índice (key_len: 2).
Tabela reparos possui 2 linhas usando índice (key_len: 9).
Não sou formado, sou mais um curioso, vou pesquisando conforme a necessidade, mas vou pesquisar sobre suas dicas @Motta.
faz um teste, tira fora o where(testa tbm tirando o group by) e coloca um limit só pra testar, 0-1000, por exemplo, compara c/ e s/ where, se isso resolver, tenta criar uma tabela com os joins e fazer o where nessa tabela.
Pode tb tentar um indice em REPAROS (cliente,data abertura), mas tire a function DATE do select , trata a outro ponto do where
Obrigado pelas dicas pessoal, a consulta passou a demorar 6 segundos só por eu especificar o id de todas as empresas (7 filiais).
Agradeço a vocês que me ajudaram, com certeza usarei essas dicas no futuro, obrigado @Motta, @paulojuchem e @Fabiano Abreu.
Olá lokaodomau, boa noite.
Qual sua necessidade, é melhorar a velocidade da inserção?
_ _
Fabiano Abreu
Papo SQL