[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