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

Roger pikurim em hotmail.com
Qua Jan 16 09:50:58 -03 2008


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! 






Mais detalhes sobre a lista de discussão lista