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

(Resolvido) Lentidão em consulta mysql


INFORMAIs

Pergunta

Amigos tenho uma tabela de vendas e que as vezes esta demorando muito para abrir

 

A query que esta sendo usada é essa 

SELECT * FROM (  
SELECT cli.CLICOD, cli.CLINOM, cli.CLICPF,  
vda.CODVEN,vda.DATVEN, vda.NUMVEN, vda.CLIVEN, vda.QTDVEN, vda.VALVEN, vda.ESPVEN, vda.TOTVEN, 
vda.MARCADO, vda.CUPOM, 
IF(vda.CUPOM!='S'   AND  vda.MARCADO!='S',vda.QTDVEN,0)   AS VENDAS_OUTRAS, 
IF(vda.CUPOM='S', vda.QTDVEN,0)  AS VENDAS_CUPOM, 
IF(vda.MARCADO='S',vda.QTDVEN,0)  AS VENDAS_NF, 
tv.CODVENDA, tv.ENTRADA_SAIDA 
FROM vendas AS vda 
LEFT JOIN clientes AS cli     ON  cli.CLICOD = vda.CLIVEN 
LEFT JOIN tvenda AS tv ON vda.NUMVEN = tv.CODVENDA 
WHERE  vda.CODVEN = 1
AND  vda.CODVEN !=0
order by vda.DATVEN DESC ) AS t_venda_itens 
order by DATVEN DESC '

 

mas demora muito

/* Affected rows: 0  Registros encontrados: 51.847  Avisos: 0  Duração de 1 query: 16,318 sec. (+ 2,511 sec. network) */

 

67mvpv.jpg

 

o resultado no sistema seria isso

1zxfd1.jpg

 

Editado por INFORMAIs
Link para o comentário
Compartilhar em outros sites

9 respostass a esta questão

Posts Recomendados

  • 0

experimente assim

SELECT * FROM (  
SELECT cli.CLICOD, cli.CLINOM, cli.CLICPF,  
vda.CODVEN,vda.DATVEN, vda.NUMVEN, vda.CLIVEN, vda.QTDVEN, vda.VALVEN, vda.ESPVEN, vda.TOTVEN, 
vda.MARCADO, vda.CUPOM, 
IF(vda.CUPOM!='S'   AND  vda.MARCADO!='S',vda.QTDVEN,0)   AS VENDAS_OUTRAS, 
IF(vda.CUPOM='S', vda.QTDVEN,0)  AS VENDAS_CUPOM, 
IF(vda.MARCADO='S',vda.QTDVEN,0)  AS VENDAS_NF, 
tv.CODVENDA, tv.ENTRADA_SAIDA 
FROM vendas AS vda 
LEFT JOIN clientes AS cli     ON  cli.CLICOD = vda.CLIVEN 
LEFT JOIN tvenda AS tv ON vda.NUMVEN = tv.CODVENDA 
WHERE  vda.CODVEN = 1
AND  vda.CODVEN !=0
order by vda.DATVEN DESC ) AS t_venda_itens 
order by DATVEN DESC LIMIT 100

abraço

Link para o comentário
Compartilhar em outros sites

  • 0

veja esses tempos de processamento

1 query: 16,318 sec.

1 query: 15,272 sec. 

voce percebeu que mesmo para 100 registros não houve uma mudança muito significativa

para somente 100 registros o tempo deveria ser de 0.03 sec 

isso leva a crer que a construção da sua select é que está causando isso

como está referenciado as suas tabelas ?

 

Link para o comentário
Compartilhar em outros sites

  • 0

Bom dia. Por favor poste o resultado do select abaixo:

EXPLAIN SELECT cli.CLICOD, cli.CLINOM, cli.CLICPF,  
vda.CODVEN,vda.DATVEN, vda.NUMVEN, vda.CLIVEN, vda.QTDVEN, vda.VALVEN, vda.ESPVEN, vda.TOTVEN, 
vda.MARCADO, vda.CUPOM, 
IF(vda.CUPOM!='S'   AND  vda.MARCADO!='S',vda.QTDVEN,0)   AS VENDAS_OUTRAS, 
IF(vda.CUPOM='S', vda.QTDVEN,0)  AS VENDAS_CUPOM, 
IF(vda.MARCADO='S',vda.QTDVEN,0)  AS VENDAS_NF, 
tv.CODVENDA, tv.ENTRADA_SAIDA 
FROM vendas AS vda 
LEFT JOIN clientes AS cli     ON  cli.CLICOD = vda.CLIVEN 
LEFT JOIN tvenda AS tv ON vda.NUMVEN = tv.CODVENDA 
WHERE  vda.CODVEN = 1
AND  vda.CODVEN !=0
order by vda.DATVEN DESC

 

Link para o comentário
Compartilhar em outros sites

  • 0

Ok. Na tabela vendas, crie um índice por datev. e rode de novo com e sem o explain.

Sem o explain verifique a alteração no tempo. Com o explain, poste o resultado.

Link para o comentário
Compartilhar em outros sites

  • 0

Na tabela vendas crie um índice por (codven,dataven). A ideia é evitar ou diminuir ao máximo o filesort.

Ele está usando o índice idx_vendas_codven para a cláusula where e filesort.

Use SELECT STRAIGHT_JOIN  para forçar o motor do MySQL a ler o select da esquerda para a direita. Ou seja, para que execute conforme a ordem que você montou o select.

SELECT STRAIGHT_JOIN cli.CLICOD, cli.CLINOM, cli.CLICPF,  
vda.CODVEN,vda.DATVEN, vda.NUMVEN, vda.CLIVEN, vda.QTDVEN, vda.VALVEN, vda.ESPVEN, vda.TOTVEN, 
vda.MARCADO, vda.CUPOM, 
IF(vda.CUPOM!='S'   AND  vda.MARCADO!='S',vda.QTDVEN,0)   AS VENDAS_OUTRAS, 
IF(vda.CUPOM='S', vda.QTDVEN,0)  AS VENDAS_CUPOM, 
IF(vda.MARCADO='S',vda.QTDVEN,0)  AS VENDAS_NF, 
tv.CODVENDA, tv.ENTRADA_SAIDA 
FROM vendas AS vda 
LEFT JOIN clientes AS cli     ON  cli.CLICOD = vda.CLIVEN 
LEFT JOIN tvenda AS tv ON vda.NUMVEN = tv.CODVENDA 
WHERE  vda.CODVEN = 1
AND  vda.CODVEN !=0
order by vda.DATVEN DESC

 

Editado por Denis Courcy
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,3k
    • Posts
      652,5k
×
×
  • Criar Novo...