Ir para conteúdo

Arquivado

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

mx loco

Ideias para performance

Recommended Posts

Boa tarde Senhores, tenho uma base de dados com enormes quantidades de registros e sem possibilidade de indexação, pois as mesmas são advindas de relatórios externos. Porem preciso cruzar os dados para gerar um novo relatório, portanto minha consulta esta ficando muito lenta. Gostaria de idéias que possa me ajudar neste caso.

 

Segue o Código da consulta simples:

SELECT
      m.Nome,
      m.Endereco,
      m.Numero,
      m.Cep,
      m.Bairro,
      m.Documento,
      m.DDD,
      m.TelefoneNumero,
      g.ARMARIO,
      t.Operadora
FROM
    mailing as m,
    geovendas as g,
    telefone as t
Where
     m.Numero=g.Numero And
     m.Cep=g.Cep_esq And
     concat(m.DDD,m.TelefoneNumero) = t.Telefone

mailing tem certa de 250.000 registros

geovendas tem cerca de 800.000 registros

telefone tem cerca de 1.200.000 registros

Preciso listar novamente os dados da tabela mailing retornando apenas os dados que coincidem com o numero e o cep da tabela geovendas e também informar a operado do telefone que consta na tabela telefone.

 

Desde já agradeço.

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

1) Este tipo de construção

concat(m.DDD,m.TelefoneNumero) = t.Telefone

em geral degrada as pesquisas

 

2) Pq o fato de advir de uma fonte de dados externa impede a indexação !?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Realmente o concat esta retardando o processo.

Estes dados vem em formato .csv, então importo eles para o mysql, que neste caso nenhum dos campos definidos não posso definir como index, pois os telefones das tabelas podem repetir e não formam um padrão. Pois a tabela principal que é mailing ja vem com DDD e telefone separado, e na tabela geovendas não tem telefone para vincular.

Segue o objetivo principal para melhor compreensão.
a tabela mailing consta os contatos da empresa, e a tabela geovendas é os locais onde a operadora atua, então preciso listas somente os dados da tabela mailing que coincide com o número e o cep da tabela geovendas, que é os endereços de atuação da empresa. A tabela telefone é somente para informar a operado do telefone.

Agradeço a atenção.

Detalhe, preciso gerar este relatório ainda como .csv rsrs

Compartilhar este post


Link para o post
Compartilhar em outros sites

Um índice não precisa ser único pode ter duplicidade sendo usado apenas para otimizar

 

Tente

criar este indice (não únicos)

mailing (Numero,Cep_esq,telefone)
geovendas (Numero,Cep_esq)
telefone(telefone)

trocar q sql para

...
geovendas as g,
telefone as t
Where
m.Numero=g.Numero And
m.Cep=g.Cep_esq And
t.Telefone = concat(m.DDD,m.TelefoneNumero)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Motta, vou fazer as alterações, posto o resultado depois.

 

Obrigado por enquanto.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Motta, simplesmente a consulta ficou super rápida, não tem nem base para comparar, só tenho a agradecer pelo ensinamento.

Mas me tire outra dúvida possível.

Existe a possibilidade de:
campo 1: DDD
campo 2: Telefone

campo 3: default value = concat(DDD,Telefone)

 

Este esta possibilidade de o MySql ja interpretar este terceiro campo?

Fico agradecido.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Existe um troço chamado coluna virtual (virtual column) , que é calculado ou concatenado , não se como (e se) o Mysql implementa.

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.