Otimizar consulta no Progress

20/01/2015

0

Olá galera, bom dia a todos!

Estou tentando fazer uma consulta num banco de dados de minha empresa.
Porém, a consulta levou em torno de 40 minutos para ser concluída. Para retornar apenas um resultado.
Minha consulta é em cima das frotas da empresa, sendo assim, eu planejo ter um resultado para cada frota, fiz um teste ontem apenas com uma, e já levou todo esse tempo, imagine quando eu colocar para percorrer por todas :z.

O meu select é o seguinte:

output to "C:/Relatorio de Preventivas.txt".

select mmv-ord-manut.cod-eqpto,
max(mmv-ord-manut.dat-abert),
mmv-tar-ord-manut.nr-ord-produ,
mmv-ord-manut.val-hodom-horim,
mmv-tar-ord-manut.cod-evento,
max(mab-movto-km-eqpto.val-km-real),
mab-period-manut.val-km-padr


from mmv-ord-manut


inner join mmv-tar-ord-manut
on mmv-ord-manut.nr-ord-produ = mmv-tar-ord-manut.nr-ord-produ

inner join mab-movto-km-eqpto
on mmv-ord-manut.cod-eqpto = mab-movto-km-eqpto.cod-eqpto

inner join mab-period-manut
on mab-period-manut.cod-eqpto = mab-movto-km-eqpto.cod-eqpto

where mmv-ord-manut.cod-eqpto = "542" and
mmv-tar-ord-manut.cod-evento = "103" and
mab-movto-km-eqpto.cod-eqpto = "542"

group by mmv-ord-manut.cod-eqpto

with width 600.
output close.

Obs: O banco de dados que estou usando é o Progress OpenEdge 10.1A
Fernando Batista

Fernando Batista

Responder

Post mais votado

20/01/2015

Olá!
A cláusula GROUP BY não deve conter todos os campos informados no SELECT, exceto o campo "mab-movto-km-eqpto.val-km-real" que está seno utilizado com a função MAX?
group by mmv-ord-manut.cod-eqpto,
	max(mmv-ord-manut.dat-abert),
	mmv-tar-ord-manut.nr-ord-produ,
	mmv-ord-manut.val-hodom-horim,
	mmv-tar-ord-manut.cod-evento,
        mab-period-manut.val-km-padr

Marisiana Battistella

Marisiana Battistella
Responder

Mais Posts

20/01/2015

Fernando Batista

Olá Marisiana, tentei implementar o bloco que você me passou, mas deu um erro na linha 3 da minha query. (select mmv-ord-manut.cod-eqpto,). Não consegui encontrar o erro, você tem alguma ideia?

Obrigado pela ajuda!
Responder

20/01/2015

Marisiana Battistella

Eu não vi que tinha duas funções MAX....
Remove a linha "max(mmv-ord-manut.dat-abert)," do GROUP BY...
Responder

20/01/2015

Fernando Batista

Consegui executar sem erros, porém.... Agora meu relatório não mostra apenas um resultado como anteriormente, ele me mostrar vários resultados, no caso, eu preciso do resultado que tenha a data mais recente (max(mmv-ord-manut.dat-abert)).


Eqpto------------ MAX---------- -------Ordem-------Contador- Evento------ -----------MAX- --------PadrÆo-

542 31/07/2012 300.344 0,0 103 289.370,1 15.000,0
542 09/06/2013 304.365 210.278,1 103 289.370,1 15.000,0
542 21/06/2013 304.405 213.500,0 103 289.370,1 15.000,0
542 28/06/2013 304.697 0,0 103 289.370,1 15.000,0
542 19/08/2013 305.726 222.731,3 103 289.370,1 15.000,0
542 02/09/2013 306.039 230.005,0 103 289.370,1 15.000,0
542 16/11/2013 307.492 279.623,2 103 289.370,1 15.000,0
542 28/11/2013 307.749 0,0 103 289.370,1 15.000,0
542 16/12/2013 308.114 238.620,0 103 289.370,1 15.000,0
542 17/03/2014 308.789 0,0 103 289.370,1 15.000,0
542 18/04/2014 309.276 0,0 103 289.370,1 15.000,0
542 03/06/2014 310.162 0,0 103 289.370,1 15.000,0
542 10/07/2014 310.576 0,0 103 289.370,1 15.000,0


No caso, antes eu tinha apenas o último elemento (com data 10/07/14).
Responder

20/01/2015

Randrade

Como ficou o seu select agora?
Responder

20/01/2015

Fernando Batista

Ficou desta forma:

output to "C:/Relat½rio de Preventivas.txt".

select mmv-ord-manut.cod-eqpto,
max(mmv-ord-manut.dat-abert),
mmv-tar-ord-manut.nr-ord-produ,
mmv-ord-manut.val-hodom-horim,
mmv-tar-ord-manut.cod-evento,
max(mab-movto-km-eqpto.val-km-real),
mab-period-manut.val-km-padr


from mmv-ord-manut


inner join mmv-tar-ord-manut
on mmv-ord-manut.nr-ord-produ = mmv-tar-ord-manut.nr-ord-produ

inner join mab-movto-km-eqpto
on mmv-ord-manut.cod-eqpto = mab-movto-km-eqpto.cod-eqpto

inner join mab-period-manut
on mab-period-manut.cod-eqpto = mab-movto-km-eqpto.cod-eqpto

where mmv-ord-manut.cod-eqpto = "542" and
mmv-tar-ord-manut.cod-evento = "103" and
mab-movto-km-eqpto.cod-eqpto = "542"




group by mmv-ord-manut.cod-eqpto,
mmv-tar-ord-manut.nr-ord-produ,
mmv-ord-manut.val-hodom-horim,
mmv-tar-ord-manut.cod-evento,
mab-period-manut.val-km-padr

with width 600.
output close.
Responder

20/01/2015

Marisiana Battistella

Nesse caso, você vai ter q definir isso na cláusula WHERE, para que a consulta retorne apenas os dados da maior data....
Responder

20/01/2015

Marisiana Battistella

Talvez essa seja uma possível solução:
output to "C:/Relat½rio de Preventivas.txt".

select mmv-ord-manut.cod-eqpto,
	mmv-ord-manut.dat-abert,
	mmv-tar-ord-manut.nr-ord-produ,
	mmv-ord-manut.val-hodom-horim,
	mmv-tar-ord-manut.cod-evento,
	max(mab-movto-km-eqpto.val-km-real), 
	mab-period-manut.val-km-padr
from mmv-ord-manut
inner join mmv-tar-ord-manut
on mmv-ord-manut.nr-ord-produ = mmv-tar-ord-manut.nr-ord-produ
inner join mab-movto-km-eqpto
on mmv-ord-manut.cod-eqpto = mab-movto-km-eqpto.cod-eqpto
inner join mab-period-manut
on mab-period-manut.cod-eqpto = mab-movto-km-eqpto.cod-eqpto

where mmv-ord-manut.cod-eqpto = "542"
and mmv-tar-ord-manut.cod-evento = "103" 
and mmv-ord-manut.dat-abert =  (select max(mom.dat-abert)
                                from mmv-ord-manut mom
                                inner join mmv-tar-ord-manut mtom
                                on mom.nr-ord-produ = mtom.nr-ord-produ
                                where mom.cod-eqpto = "542"
                                and mtom.cod-evento = "103")
group by mmv-ord-manut.cod-eqpto,
mmv-ord-manut.dat-abert,
mmv-tar-ord-manut.nr-ord-produ,
mmv-ord-manut.val-hodom-horim,
mmv-tar-ord-manut.cod-evento,
mab-period-manut.val-km-padr

with width 600.
output close.

Não sei se é a melhor solução.. Eu não conheço a estrutura e os nomes das tabelas são difíceis de entender....
Responder

24/01/2015

Fernando Batista

Muito obrigado Marisiana, me desculpe pela falta de retorno, tive alguns imprevisto com meu servidor e fiquei sem internet.
Agora sim, a consulta traz as informações que eu quero.

Para ficar perfeito, falta um detalhe, quero que esta consulta não seja filtrada pelo mmv-ord-manut.cod-eqpto = "542", quero uma linha para cada elemento desta coluna. Tentei remover os filtros, mudar as junções, mas não consegui, retirando os filtros, eu tive o seguinte resultado:
Eqpto------------ Abertura----- -------Ordem-------Contador- Evento------ -----------MAX- --------PadrÆo-

318 19/12/2014 311.360 21.215,7 103 248.490,3 350,0
318 19/12/2014 311.360 21.215,7 103 248.490,3 1.500,0
318 19/12/2014 311.360 21.215,7 103 248.490,3 2.500,0

Como posso fazer isto dar certo? Minha query ficou assim:
output to "C:/Relat½rio de Preventivas.txt".
 
select mmv-ord-manut.cod-eqpto,
    mmv-ord-manut.dat-abert,
    mmv-tar-ord-manut.nr-ord-produ,
    mmv-ord-manut.val-hodom-horim,
    mmv-tar-ord-manut.cod-evento,
    max(mab-movto-km-eqpto.val-km-real), 
    mab-period-manut.val-km-padr
from mmv-ord-manut
inner join mmv-tar-ord-manut
on mmv-ord-manut.nr-ord-produ = mmv-tar-ord-manut.nr-ord-produ
inner join mab-movto-km-eqpto
on mmv-ord-manut.cod-eqpto = mab-movto-km-eqpto.cod-eqpto
inner join mab-period-manut
on mab-period-manut.cod-eqpto = mab-movto-km-eqpto.cod-eqpto
 
where 
 mmv-tar-ord-manut.cod-evento = "103"
and mmv-ord-manut.dat-abert =  (select max(mom.dat-abert)
                                from mmv-ord-manut mom
                                inner join mmv-tar-ord-manut mtom
                                on mom.nr-ord-produ = mtom.nr-ord-produ
                                where 
                                 mtom.cod-evento = "103")
group by mmv-ord-manut.cod-eqpto,
mmv-ord-manut.dat-abert,
mmv-tar-ord-manut.nr-ord-produ,
mmv-ord-manut.val-hodom-horim,
mmv-tar-ord-manut.cod-evento,
mab-period-manut.val-km-padr
 
with width 600.
output close.



Desde já, obrigado pela atenção de quem me ajudou, e me desculpem pela falta de feed.
Responder

24/01/2015

Marisiana Battistella

Sem problema!!
Não precisa remover o filtro porque senão não vai retornar os dados que vc precisa..
Pelo que entendi você quer acrescentar duas colunas, uma para cada um dos eventos (103 e 542), seria isso?
Se for isso, você pode fazer utilizando o CASE, como nesse exemplo:
select mmv-ord-manut.cod-eqpto,
    mmv-ord-manut.dat-abert,
    mmv-tar-ord-manut.nr-ord-produ,
    mmv-ord-manut.val-hodom-horim,
    CASE 
          WHEN  mmv-tar-ord-manut.cod-evento = '103' THEN   
                  --- aqui vai a informação/coluna que será mostrada nessa condição. Ex.:   max(mab-movto-km-eqpto.val-km-real), 
          END as evento_103.
    CASE 
          WHEN  mmv-tar-ord-manut.cod-evento = '542' THEN
                 ---- aqui vai a informação/coluna que será mostrada nessa condição  
          END as evento_542
    max(mab-movto-km-eqpto.val-km-real), 
    mab-period-manut.val-km-padr
[...]

Precisa ver qual é a informação que será mostrada na coluna, se é um valor, uma data, etc...
Responder

27/01/2015

Fernando Batista

É.. Assim também não funcionou, a minha grande dificuldade aqui, é que o banco que eu trabalho (Progress) usa um compilador que não funciona muito bem com sql, ele usa alguma sintaxes diferentes. No caso, a cláusula case não funcionou de jeito nenhum... Enfim..
Depois de muito analisar e testar meu código, cheguei a raiz do meu problema.
Quando uso a sub query com o max, estou consultado o registro com a maior data, correto? O problema está aí, ele está pegando o registro com a maior data de TODAS as ordens de manutenção. O que quero na verdade, é o seguinte, quero o registro com a MAIOR data de cada EQUIPAMENTO.
Acredito que o problema esteja aí, pois quando executo o código (abaixo), ele me retorna realmente, uma ordem que foi aberta alguns dias atrás, com certeza o problema é este que eu disse. Você pode me ajudar a corrigir isto no código?

O que estou usando é este:
output to "D:/Troca de oleo_Correct2.txt".

select mmv-ord-manut.cod-eqpto,
	   mmv-ord-manut.dat-abert,
	   mmv-ord-manut.val-hodom-horim,
	   mmv-tar-ord-manut.cod-evento,
	   mab-movto-km-eqpto.val-km-real,
	   mab-period-manut.val-km-padr,
	   mab-comptmento.des-comptmento
	   
from mmv-ord-manut

inner join mmv-tar-ord-manut
on mmv-ord-manut.nr-ord-produ = mmv-tar-ord-manut.nr-ord-produ

inner join mab-movto-km-eqpto
on mmv-ord-manut.dat-abert = mab-movto-km-eqpto.dat-movto


inner join mab-period-manut
on mmv-tar-ord-manut.cod-evento = mab-period-manut.cod-evento and
mmv-tar-ord-manut.cod-eqpto = mab-period-manut.cod-eqpto

inner join mab-comptmento
on mab-comptmento.cod-comptmento = mab-period-manut.cod-comptmento



where mmv-tar-ord-manut.cod-evento = "100"  and
mmv-ord-manut.dat-abert = (select max(mom.dat-abert)                                from mmv-ord-manut mom
                                inner join mmv-tar-ord-manut mtom
                                on mom.nr-ord-produ = mtom.nr-ord-produ
                                where       mtom.cod-evento = "100" group by mmv-ord-manut.cod-eqpto) 
group by mmv-ord-manut.cod-eqpto,
mmv-ord-manut.dat-abert,
mmv-tar-ord-manut.nr-ord-produ,
mmv-ord-manut.val-hodom-horim,
mmv-tar-ord-manut.cod-evento,
mab-period-manut.val-km-padr



with width 600.
output close.
Responder

Que tal ter acesso a um e-book gratuito que vai te ajudar muito nesse momento decisivo?

Ver ebook

Recomendado pra quem ainda não iniciou o estudos.

Eu quero
Ver ebook

Recomendado para quem está passando por dificuldades nessa etapa inicial

Eu quero

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar