[firebase-br] Ajuda c/ Otimização de SQL (Muito importante!)!!!

Paulo (O2 Tecnologia) paulo em o2tecnologia.com.br
Qua Jan 16 10:40:16 -03 2008


Tente algo assim.

SELECT O.ID_AREA,O.ID_OPERACAO,
                 AVG(P.DURACAO) TOTAL,
                 AVG(P.TRANSPORTE) TRANSPORTE,
                 AVG(P.LIMITE) LIMITE,
                 CASE WHEN COUNT(*) > 1 THEN COUNT(*) ELSE 0 END CICLOS,
                 SUM(CASE WHEN P.EXCEDIDO > 0 THEN 1 ELSE 0 END) EXCEDIDOS,
                 SUM(EXCEDIDO) MINUTOS

FROM OPERACOES O
LEFT OUTER JOIN PROCESSADOS P ON  (( O.ID_OPERACAO = P.OPERACAO_ID ) AND ( O.ID_AREA = P.AREA_ID ))
WHERE ( P.INICIO >= '01/01/2007 00:00:00' ) AND ( P.TERMINO <= '12/31/2007 23:59:59' ) AND
( P.TURNO BETWEEN 1 AND 3 )
GROUP BY O.ID_AREA,O.ID_OPERACAO




Roger escreveu:
> Bom dia, estou com um dilema super urgente! tenho uma
> tabela c/ 2 milhões de registros e a cada mês ela aumenta
> uns 150 mil registros.
>
> Possuo uma SP de consulta:
>
> SELECT O.ID_AREA,O.ID_OPERACAO,
>                  AVG(P.DURACAO) TOTAL,
>                  AVG(P.TRANSPORTE) TRANSPORTE,
>                  AVG(P.LIMITE) LIMITE,
>                  CASE WHEN COUNT(*) > 1 THEN COUNT(*) ELSE 0 END CICLOS,
>                  SUM(CASE WHEN P.EXCEDIDO > 0 THEN 1 ELSE 0 END) EXCEDIDOS,
>                  SUM(EXCEDIDO) MINUTOS
>
> FROM OPERACOES O
> LEFT OUTER JOIN PROCESSADOS P ON  (O.ID_OPERACAO = P.OPERACAO_ID) AND
>                                                                              
>    (O.ID_AREA = P.AREA_ID) AND
>                                                                              
>   ((P.INICIO >= '01/01/2007 00:00:00') AND
>                                                                              
>    (P.TERMINO <= '12/31/2007 23:59:59')) AND
>                                                                              
>     P.TURNO IN(1,2,3)
> GROUP BY O.ID_AREA,O.ID_OPERACAO
>
> Esta SP demora quase seis segundos para rodar sendo que a tabela PROCESSADOS 
> tem 100 mil registros, porém quando tem 1 milhão a demora multiplica por 10, 
> ou seja, demora quase 60 segundos p/ rodar, preciso fazer diferente:
>
> Percebi que se eu tirar a consulta inicial na tabela Operacoes, que é feita 
> para poder mostrar todas as operacoes na lista mesmo que não haja 
> ocorrencias na tabela PROCESSADOS isso c/ LEFT OUTER JOIN, então e se eu 
> consultar separadamente um SELECT * FROM OPERACOES, e depois rodar outro SQL 
> diretamente na tabela PROCESSADOS, eu percebi que o SQL da PROCESSADAS 
> DIRETO, sem LEFT OUTER JOIN demora menos de MEIO SEGUNDO, então como posso 
> fazer para JUNTAR OS DOIS SQLS no FIREBIRD?
>
> Gerando o sql original como resultado?
>
> Obrigado!
>
> Roger! 
>
>
>
> ______________________________________________
> FireBase-BR (www.firebase.com.br) - Hospedado em www.locador.com.br
> Para editar sua configuração na lista, use o endereço http://mail.firebase.com.br/mailman/listinfo/lista_firebase.com.br
> Para consultar mensagens antigas: http://firebase.com.br/pesquisa
>
>
>   



Mais detalhes sobre a lista de discussão lista