Ir para conteúdo
Fórum Script Brasil
  • 0

JOIN demorado


Parub@

Pergunta

Olá amigos, boa tarde.

Estou começando agora com MySQL, antes trabalhava com Access. Preciso de uma ajudinha básica...

Tenho a consulta SQL abaixo, que me retorna uma lista dos clientes e o número de pedidos que já foram feitos por cada um.

A tabela de clientes tem aprox. 6 mil registros, e a tabela de pedidos tem quase 10 mil... essa consulta funcionava rapidinho no Access, mas no MySQL está demorando quase 1 minuto!!

SELECT
  Clientes.clt_Id,
  Clientes.clt_Data,
  Clientes.clt_Nome,
  Clientes.clt_Email,
  COUNT(Pedidos.ped_Id) AS NPeds
FROM
  Pedidos RIGHT JOIN Clientes ON Pedidos.ped_ClienteId = Clientes.clt_Id 
GROUP BY
  clt_Id, clt_Data, clt_Nome, clt_Email
ORDER BY
  clt_Data DESC

Se eu troco o "RIGHT JOIN" para "LEFT JOIN" fica bem mais rápido, porém não aparecem os clientes que nunca fizeram pedido.

Alguém poderia me informar o que pode estar ocorrendo pra demorar tanto? Ou o que posso mudar para a consulta ser mais rápida...

Agradeço deste já!

Abraços,

Parub@

Link para o comentário
Compartilhar em outros sites

4 respostass a esta questão

Posts Recomendados

  • 0

Boa tarde,

Parece que consegui resolver. Adicionei uma chave (índice) no campo ped_ClienteId da tabela Pedidos. Preciso fazer mais testes, mas parece que está bem mais rápido.

Se alguém tiver alguma idéia para otimizar o SELECT, por favor me avise. Eu agradeço muito!!

Abraços,

Parub@

Link para o comentário
Compartilhar em outros sites

  • 0

Parub@,

bom dia.

Em primeiro lugar,

qual o tamanho das suas tabelas?

pois, vi que você não utiliza nenhum filtro,

assim a tabela toda será processada.

Tente o seguinte:

SELECT

Clientes.clt_Id,

Clientes.clt_Data,

Clientes.clt_Nome,

Clientes.clt_Email,

COUNT(Pedidos.ped_Id) AS NPeds

FROM

Clientes, Pedidos

WHERE

Clientes.clt_Id = Pedidos.ped_ClienteId

GROUP BY

clt_Id, clt_Data, clt_Nome, clt_Email

ORDER BY

clt_Data DESC

Uma dica legal é SEMPRE deixar a tabela menor do lado esquerdo e utilizar o JOIN

desta forma:

FROM

CLIENTE JOIN PEDIDOS ON Clientes.clt_Id = Pedidos.ped_ClienteId

e se nada disso funcionar verifique também os indices.

Link para o comentário
Compartilhar em outros sites

  • 0

Olá Caio, boa tarde.

A tabela de clientes tem aprox. 6 mil registros, e a tabela de pedidos tem quase 10 mil

Eu estou fazendo uma tela onde listo os clientes e o número de pedidos que já foram feitos pelo mesmo. Eu criei um sistema de paginação com o ASP, mas mesmo assim preciso abrir a tabela inteira...

Com a inclusão de alguns índices em campos chave, consegui fazer a consulta ficar bem mais rápida. Mas mesmo assim lhe agradeço as dicas, que com certeza estarei utilizando nos meus sistemas.

God Bless You!!

Parub@

Link para o comentário
Compartilhar em outros sites

  • 0

Oi Parub@,

Outra dica é inverter as tabelas e usar a cláusula [sTRAIGHT_JOIN].

SELECT STRAIGHT_JOIN 
  Clientes.clt_Id,
  Clientes.clt_Data,
  Clientes.clt_Nome,
  Clientes.clt_Email,
  COUNT(Pedidos.ped_Id) AS NPeds
FROM
  Clientes 
  LEFT JOIN Pedidos  ON Clientes.clt_Id = Pedidos.ped_ClienteId
GROUP BY
  clt_Id, clt_Data, clt_Nome, clt_Email
ORDER BY
  clt_Data DESC

Caio,

A instrução que você passou é a mesma que um INNER JOIN e que resultará no conjunto intercessão entre CLIENTES e PEDIDOS.

O que o Parub@ quer é o resultado de CLIENTES - PEDIDOS e isto é dado com LEFT ou RIGTH JOIN dependendo da posição das tabelas.

A cláusula [sTRAIGHT_JOIN] forçará a leitura da esquerda para a direita então inverti as tabelas e a cláusula RIGTH JOIN para LEFT JOIN.

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,2k
    • Posts
      652k
×
×
  • Criar Novo...