Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

lokaodomau

Prazo de entrega apertado

Recommended Posts

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.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Fez o Plano de Execução da query ?
A estatística do bd está atualizada ? Talvez seja o caso da atualização diária.

Compartilhar este post


Link para o post
Compartilhar em outros sites

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.

Compartilhar este post


Link para o post
Compartilhar em outros sites

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.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Pode tb tentar um indice em REPAROS (cliente,data abertura), mas tire a function DATE do select , trata a outro ponto do where

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.