Ir para conteúdo

POWERED BY:

Arquivado

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

Bruno Conte

Mysql lento com Order by

Recommended Posts

boa noite pessoal, tenho um codigo onde preciso pegar os ultimos resultados, então fiz minha clausula do mysql assim:

 

 

 

SELECT a.C5_EMISSAO, a.C5_NUM, a.C5_NOMECLI, b.C6_NUM, b.C6_DESCRI, b.C6_QTDVEN, b.C6_QTDENT, b.C6_PRCVEN
FROM sc5010 AS a
INNER JOIN sc6010 AS b ON a.C5_NUM = b.C6_NUM
WHERE b.C6_QTDVEN > B.C6_QTDENT
LIMIT 0,200

 

quando eu coloco o order by ele demora d+, isso porque meu banco deva ter 300 mil registros em cada tabela

 

 

 

SELECT a.C5_EMISSAO, a.C5_NUM, a.C5_NOMECLI, b.C6_NUM, b.C6_DESCRI, b.C6_QTDVEN, b.C6_QTDENT, b.C6_PRCVEN
FROM sc5010 AS a
INNER JOIN sc6010 AS b ON a.C5_NUM = b.C6_NUM
WHERE b.C6_QTDVEN > B.C6_QTDENT order by a.C5_EMISSAO DESC
LIMIT 0,200

 

existe alguma maneira de configura no proprio mysql para que as consultas como padrão seja order by desc, sempre puxando o ultimo registro?

Compartilhar este post


Link para o post
Compartilhar em outros sites

tente colocar um indice na coluna que vc usa o order by e veja se melhora um pouco.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Motta fiz assim:

 

 

 

select *
from sc5010 t1
where CHANGE_DATE = (select max(CHANGE_DATE)
from sc6010 t2
where t2.C6_NUM = t1.C5_NUM)
LIMIT 0,200

 

so que nao deu certo, o que fiz de errado?

Compartilhar este post


Link para o post
Compartilhar em outros sites

faça na mesma tabela

 

 

select * 

from sc5010 t1
where CHANGE_DATE = (select max(CHANGE_DATE)
                     from sc5010 t2

                     where t2.C6_NUM = t1.C5_NUM) 
LIMIT 0,200

... cruze este resultado contra a outra tabela a sc6010

Compartilhar este post


Link para o post
Compartilhar em outros sites

Em qual coluna está a data que deve ser a mais recente ?

 

faça um select com max para saber o registro mais recente

 

use este slect como tabela virtual e faça join com a outra tabela

Compartilhar este post


Link para o post
Compartilhar em outros sites

Motta ai que mora o problema, esta tabela e uma conversão de um banco DB2 da totvs e o campo data no sistema da totvs e varchar.

então ele não possui campo date.

 

a data vem por exemplo 20130916

 

em campo texto!!!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Neste formato yyyymmdd o max funciona, trabalho com Totvs em Oracle, acredite funciona.

Compartilhar este post


Link para o post
Compartilhar em outros sites

O que são a sc5 e sc6 ?

 

Talvez eu já tenha esta query,

Senao posto amanha.

Compartilhar este post


Link para o post
Compartilhar em outros sites
select *

from (select *  

         from sc5010 t1 

        where CHANGE_DATE = (select max(CHANGE_DATE)                      

                                                from sc5010 t2                      

                                                where t2.C6_NUM = t1.C5_NUM)  

        LIMIT 0,200) t4, sc6010 t3

where t3.C6_NUM = t4.C5_NUM)

tente algo assim ...

Compartilhar este post


Link para o post
Compartilhar em outros sites

motta so hj vi, fiquei fora uns dias.

 

sc5 e cabeçalho do pedido

sc6 itens do pedido no sistema da totvs



quando testei deu o seguinte erro:

 

 

#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ')' at line 15

Compartilhar este post


Link para o post
Compartilhar em outros sites
SELECT *
FROM (SELECT *  
      FROM SC5010 T1
      WHERE C5_EMISSAO = (SELECT MAX(C5_EMISSAO)                      
                           FROM SC5010 T2                      
                           WHERE T2.C5_FILIAL = T1.C5_FILIAL
                           AND   T2.C5_CLIENTE = T1.C5_CLIENTE
                           AND    T2.C5_NUM = T1.C5_NUM
                           AND   T2.D_E_L_E_T_ = ' ')
      AND T1.D_E_L_E_T_ = ' ') SC5010,
      SC6010 SC6010
WHERE SC5010.C5_FILIAL = SC6010.C6_FILIAL
AND   SC5010.C5_CLIENTE = SC6010.C6_CLI
AND    SC5010.C5_NUM = SC6010.C6_NUM
AND   SC5010.D_E_L_E_T_ = ' '
AND   SC6010.D_E_L_E_T_ = ' '

aqui rodou (Oracle)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Motta, na verdade o que preciso e mostrar o ultimos cadastros.

20130921

 

e ele esta mostrando os primeiros cadastros feitos no banco em 2006.

 

att.



e quando coloco order by C6_NUM DESC por exemplo, demora 3 minutos para mostrar uma consulta com os ultimos 200 cadastros.

e olha que ainda estou testando no banco, quando jogar no sistema php creio que vai demorar uma semana.

 

Por isso queria ver nas configs do mysql tentar colocar para a ordenação do mysql fosse sempre DESC

Compartilhar este post


Link para o post
Compartilhar em outros sites

A query que postei deve estar "próxima" da solução do problema.

 

Talvez um top na tabela virtual ao ínvez do select max resolva.

 

 

Para os índices de BD em sistemas da Totvs é recomendado que seja feita no Configurador e não no Banco, abra um chamado caso tenha dúvida.

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.